本文摘自网络,作者,侵删。
你想知道你的Go程序在做什么吗? go tool trace可以向你揭示:Go程序运行中的所有的运行时事件。 这种工具是Go生态系统中用于诊断性能问题时(如延迟,并行化和竞争异常)最有用的工具之一。 在我之前的博客文章中,我提到我们在Pusher中使用go tool trace来跟踪为何Go垃圾收集器有很长的停顿时间。 在这篇博文中,我更加深入的介绍go toll trace。
go tool trace 试用
go tool trace可以显示大量的信息,所以从哪里开始是个问题。 我们首先简要介绍使用界面,然后我们将介绍如何查找具体问题。
go tool traceUI是一个Web应用程序。 下面我已经嵌入了一个这个web程序的实例! 此示例是可视化并行快速排序实现的追踪信息:
请尝试这个例子!有关导航UI的帮助,请单击右上角的“?”。单击屏幕上的任何事件可以在下面获取更多信息。这里有一些你可以从这个追踪中找到的有价值的信息:
-
这个程序运行多长时间?
-
有多少goroutines运行872微秒?
-
该进程何时第一次升级到使用三个OS线程?
-
什么时候主要调用qSortPar?
-
是什么导致额外的过程(1,2和3)开始工作?
- proc#2什么时候停止?
太棒了! 我应该怎么在我的程序中使用go tool trace?
您必须调整程序以将运行时事件写入二进制文件。 这涉及从标准库导入runtime/trace,并添加几行样板代码。 这个快速的视频将引导您:
视频
以下是需要复制粘贴的代码:
package main
import (
"os"
"runtime/trace"
)
func main() {
f, err := os.Create("trace.out")
if err != nil {
panic(err)
}
defer f.Close()
err = trace.Start(f)
if err != nil {
panic(err)
}
defer trace.Stop()
// Your program here
}
这将使您的程序以二进制格式在文件trace.out中写入事件数据。 然后可以运行go tool trace trace.out。 这将解析跟踪文件,并使用可视化程序打开浏览器。 该命令还将启动服务器,并使用跟踪数据来响应可视化操作。 在浏览器中加载初始页面后,单击“View trace”。 这将加载跟踪查看器,如上面嵌入的那样。
使用go tool trace能解决什么问题?
我们来看一个如何使用这个工具跟踪典型问题的例子。
诊断延迟问题
当完成关键任务的goroutine被阻止运行时,可能会引起延迟问题。 可能的原因有很多:做系统调用时被阻塞; 被共享内存阻塞(通道/互斥等); 被runtime系统(例如GC)阻塞,甚至可能调度程序不像您想要的那样频繁地运行关键goroutine。
所有这些都可以使用go tool trace来识别。 您可以通过查看PROCs时间线来跟踪问题,并发现一段时间内goroutine被长时间阻塞。 一旦你确定了这段时间,应该给出一个关于根本原因的线索。
作为延迟问题的一个例子,让我们看看上一篇博文中长时间的GC暂停:
红色的事件代表了唯一的程序goroutine正在运行。 在所有四个线程上并行运行的goroutines是垃圾收集器的MARK阶段。 这个MARK阶段阻止了主要的goroutine。 你能出到阻止runtime.main goroutine的时间长短吗?
相关阅读 >>
[Go] Golang happen before 的保证原则
聊聊dubbo-Go-proxy的timeoutfilter
更多相关阅读请进入《Go》频道 >>

Go语言101
一个与时俱进的Go编程知识库。