一、Golang性能跟踪工具trace简介
1.1 Golang性能跟踪工具trace
trace
是Golang的一个性能跟踪工具,可以用于分析程序在一段时间内的执行情况。以下是使用trace的基本步骤:
- 在代码中导入
runtime/trace
包; - 在程序中使用
trace.Start
和trace.Stop
来启动和停止跟踪。例如:
|
|
- 运行程序并等待它执行一段时间;
- 使用
go tool trace
命令加载跟踪输出文件并进行分析。例如:
|
|
这将启动可视化界面,打开一个浏览器窗口,显示程序的跟踪数据,包括事件图、调用堆栈、Goroutine等信息。
可视化界面上展示的各项指标:
- View trace:查看跟踪
- Goroutine analysis:Goroutine 分析
- Network blocking profile:网络阻塞概况
- Synchronization blocking profile:同步阻塞概况
- Syscall blocking profile:系统调用阻塞概况
- Scheduler latency profile:调度延迟概况
- User defined tasks:用户自定义任务
- User defined regions:用户自定义区域
- Minimum mutator utilization:最低 Mutator 利用率
trace 的各项指标详细说明参考博文:https://blog.csdn.net/u013474436/article/details/105232768/
1.2 使用go tool trace
能解决什么问题
1、诊断延迟问题
当完成关键任务的goroutine被阻止运行时,可能会引起延迟问题。 可能的原因有很多:做系统调用时被阻塞; 被共享内存阻塞(通道/互斥等); 被runtime系统(例如GC)阻塞,甚至可能调度程序不像想要的那样频繁地运行关键goroutine。
所有这些都可以使用go tool trace来识别。可以通过查看PROCs时间线来跟踪问题,并发现一段时间内goroutine被长时间阻塞。一旦确定了这段时间,应该给出一个关于根本原因的线索。
2、诊断并行问题
并行运行代码往往效率较低; 特别是在goroutine是非常短暂的,或者他们之间有很多的竞争的情况下。 这是使用此工具的另一个原因:尝试这两种方法,并检查哪种工作最适合您的用例。