Go调优神器trace介绍


本文摘自网络,作者,侵删。

你想知道你的Go程序在做什么吗? go tool trace可以向你揭示:Go程序运行中的所有的运行时事件。 这种工具是Go生态系统中用于诊断性能问题时(如延迟,并行化和竞争异常)最有用的工具之一。 在我之前的博客文章中,我提到我们在Pusher中使用go tool trace来跟踪为何Go垃圾收集器有很长的停顿时间。 在这篇博文中,我更加深入的介绍go toll trace。

go tool trace 试用
go tool trace可以显示大量的信息,所以从哪里开始是个问题。 我们首先简要介绍使用界面,然后我们将介绍如何查找具体问题。

Go调优神器trace介绍

go tool traceUI是一个Web应用程序。 下面我已经嵌入了一个这个web程序的实例! 此示例是可视化并行快速排序实现的追踪信息:

请尝试这个例子!有关导航UI的帮助,请单击右上角的“?”。单击屏幕上的任何事件可以在下面获取更多信息。这里有一些你可以从这个追踪中找到的有价值的信息:

  • 这个程序运行多长时间?

  • 有多少goroutines运行872微秒?

  • 该进程何时第一次升级到使用三个OS线程?

  • 什么时候主要调用qSortPar?

  • 是什么导致额外的过程(1,2和3)开始工作?

  • proc#2什么时候停止?

Go调优神器trace介绍太棒了! 我应该怎么在我的程序中使用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暂停:

Go调优神器trace介绍

红色的事件代表了唯一的程序goroutine正在运行。 在所有四个线程上并行运行的goroutines是垃圾收集器的MARK阶段。 这个MARK阶段阻止了主要的goroutine。 你能出到阻止runtime.main goroutine的时间长短吗?

阅读剩余部分

相关阅读 >>

Go语言常量

2017年最适合Go新手的十本书

[Go] Golang happen before 的保证原则

Golang 语言的内存管理

聊聊dubbo-Go-proxy的timeoutfilter

Go并发编程实战学习(一)

Golang可以写单片机吗

2.Golang 操作elasticsearch-7

关于Golang 全局sql数据库连接

Golang 数组存的是什么

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...