文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

GoTrace - Go 并发3D追踪

GoTrace是Go并发的3D WebGL可视化工具。 它对通过 go追踪工具 产生的追踪数据进行分析 ,并呈现并发流的可视化。

原文: https://divan.github.io/posts/go_concurrency_visualize/

 GopherCon'16幻灯片: http://divan.github.io/talks/2016/gophercon/

简介

该工具通过分析Go并发流的 执行轨迹. 来生成Go并发流的3D可视化。   如果需要查看可视化,您需要一个具有支持WebGL的现代浏览器(现在几乎所有的浏览器都支持)。

它的主要目标是成为Go并发的教学工具。 它适用于产生短追踪的小程序(请参阅下面的规模问题)。

第 1 段(可获 2 积分)

用法

首先,安装 gotrace:

go get -u github.com/divan/gotrace

  然后,使用修补后的Go在运行时生成追踪和二进制文件。 有两种方法可以做到这一点 - 使用 a docker 容器本地应用补丁

使用预制docker图像简单示例(跳转到详细说明):

docker run --rm -it \
    -e GOOS=darwin \
    -v $(pwd):/src divan/golang:gotrace \
        go build -o /src/binary /src/examples/hello.go
./binary 2> trace.out
gotrace ./trace.out ./binary

或者,使用本地修补的Go安装(跳转到详细说明):

gotrace examples/hello.go
第 2 段(可获 2 积分)

准备你的程序

现在, 在你尝试自己进行编码之前,请了解一些重要的事情。 首先可以随意运行examples文件夹里面的示例代码。

理论上,gotrace凭借自身的特性就可以完成所有不可思议的事情,并且能够处理任何Go程序。 这是也是我们的目标,但在目前,如果你想获得好的/有意义的可视化,那么你应该遵循一些规则和建议。

让其运行时间更短

当前程序可视化的高度是一个固定值,因此任何轨迹都适合屏幕的高度。 这意味着,运行1分钟的示例从程序运行的第1秒开始就可以不同的规模可视化。

第 3 段(可获 2 积分)

这都取决于你想看到什么样的效果,但经验法则是 - 执行时间越短越好。 请参阅examples / 文件夹中的优秀示例,这样可以制作出更好的可视化效果。

在运行时插入/自动跟踪

为了生成跟踪,你的程序应该通过特殊代码的检测。 gotrace可以为你自动做到这一点,但在某些情况下,更聪明选择的是自己来完成这段代码。 这里有一个典型的例子:

package main

import (
    "os"
    "runtime/trace"
)

func main() {
    trace.Start(os.Stderr)
    ...
    trace.Stop()
}

现在,很重要的一件事是将追踪代码写入os.Stderr。 如果在你的例子中,在其他的需求需要用到标准的错误输出,请参见问题#X。

第 4 段(可获 2 积分)

考虑插入短时间的time.Sleep()调用

如果你试图可视化一些发生在纳秒/微秒级别的事情,一个聪明的选择是插入time.Sleep(1 * time.Millisecond)调用,以获得更清晰的可视化。

例如,如果在你代码的一个循环中运行了100个goroutine,它们的ID和它们开始的顺序可能会不同,这样会导致一些图片混乱。 所以,我们改变一下代码:

    for i := 0; i < 100; i++ {
        go player(table)
    }

改变成:

    for i := 0; i < 100; i++ {
        time.Sleep(1 * time.Millisecond)
        go player(table)
    }

这样将有助于更好地可视化。

第 5 段(可获 2 积分)

尝试保持小数量的goroutines /事件

被呈现的对象越少越好。 如果你有很多东西要渲染,WebGL只会挂起你的浏览器。 另外,请记住,可视化的目的是用来表达一些东西的。 所以如果运行1024个对象工作,这将导致一个繁重的可视化,而且你不会看到独立的goroutines。 如果将此值设置为36,将产生更清晰的图像。

详细说明

下一步是构建你的程序。 你需要用打完修补的Go在运行时进行构建。 所以如果你自己来修补它(A附录 A),你只需要运行go build,或者,更简单,让gotrace为你做。 但是大多数人,可能不会想这样做,而是更喜欢使用Docker。

第 6 段(可获 2 积分)

使用 Docker

你需要安装和运行 Docker.

然后从Docker Hub中获取图像:

docker pull divan/golang:gotrace

或者你自己编译:

docker build -t "divan/golang:gotrace" -f runtime/Dockerfile runtime/

如果一切正常,你应该在你本地docker中有divan/golang:gotrace图像 (用docker images 命令查看).

现在,使用下面命令产生二进制文件:

MacOS X:

docker run --rm -it \
    -e GOOS=darwin \
    -v $(pwd):/src divan/golang:gotrace \
        go build -o /src/binary /src/examples/hello.go
Linux:
docker run --rm -it \
    -v $(pwd):/src divan/golang:gotrace \
        go build -o /src/binary /src/examples/hello.go
第 7 段(可获 2 积分)
Windows
docker run --rm -it \
    -e GOOS=windows \
    -v $(pwd):/src divan/golang:gotrace \
        go build -o /src/binary.exe /src/examples/hello.go

3. 运行它并保存追踪。

一旦你有二进制文件,你可以运行它并保存跟踪:

./binary 2> trace.out

4. 运行gotrace (最后)

现在,是时候运行gotrace 和使用二进制文件和追踪来产生可视化:

gotrace ./trace.out ./binary

现在开始启动浏览器和渲染可视化。

可视化

颜色

goroutine的不同颜色代表不同的状态。

  • 红色-堵塞状态
  • 绿色- 解锁
  • 黄色- 解锁和使用CPU
第 8 段(可获 2 积分)

goroutines在通道上的连接和发送的颜色是相同的。

快捷键

您可以使用鼠标/触控板缩放/旋转/平移来可视化。 在MacOS X上,您使用单击和移动旋转,双指触摸缩放,以及双指点击以及拖拽。

您也可以尝试使用一个 Leap 运动控制器用来缩放或用手旋转 - 切换到leap 分支。

还有一些其他有用的快捷键:

  • r - 重启
  • p - 暂停
  • 1, 2, 3, 4, 0 - 高亮模式 (0 - 默认)
  • +/- - 增加/减少线条的宽度
  • s/f - 更慢/更快的动画

限制/已知问题

  • 发送到通道的变量的值仅支持整数类型。(见问题 #3)
  • 缓冲通道不工作(到目前不支持)(见问题 #2)
第 9 段(可获 2 积分)

附录 A - Go 本地补丁

如果你真的想使用getrace,你可能想自己来运行Go补丁。 可以让你运行getrace时就像gotrace main.go一样简单,没有上述中的任何中间步骤。

这里将介绍是如果做到的 (MacOS X 和Linux).

  1. 假如你的 Go 安装在 /usr/local/go (默认), 下载Go 1.6.3 版本并解压到/usr/local/go163.

    sudo -i
    mkdir -p /usr/local/go163
    curl https://storage.googleapis.com/golang/go1.6.3.src.tar.gz | tar -xz -C /usr/local/go163
    
  2. 然后,复制补丁并应用:

    sudo patch -p1 -d /usr/local/go163/go < runtime/go1.6.3-tracenew.patch
    
  3. 构建新的运行

    sudo -i
    cd /usr/local/go163/go/src
    export GOROOT_BOOTSTRAP=/usr/local/go # or choose yours
    ./make.bash
    
  4. 最后,导出PATH或使用ln -s命令来确保这个版本的Go确实已经安装到你的系统中:

    export PATH=/usr/local/go163/go/bin:$PATH
    

    或者 (假设你的PATH设置为 /usr/local/go)

    sudo mv /usr/local/go /usr/local/go-orig
    sudo ln -nsf /usr/local/go163/go /usr/local/go
    
第 10 段(可获 2 积分)

注意:通过sudo ln -nsf /usr/local/go-orig /usr/local/go 返回以前的安装

现在,你可以运行gotrace main.go命令并获得结果。

许可证

MIT 许可证

第 11 段(可获 2 积分)

文章评论