知识卡片

Trace看时间线

普通读书笔记卡 · 1488.a.1

内容

trace 展示协程创建/结束、堵塞、网络 I/O、GC 等事件在时间轴上的互动,补足 pprof 缺时序关系的短板。但采集本身要 STW 获取协程快照、在每个关键事件处插桩写入,会改变程序的时间特征;一次采集只反映当次窗口内的行为,也不能替代 pprof 看函数内部细节,需两者配合。

参考来源

- 位置:《Go语言底层原理剖析》第21章《调试利器:特征分析与事件追踪》21.3.1节《trace工具的用法与说明》与21.5节《trace底层原理》 - 结论依据:原文明确 trace 提供"指定时间内程序发生的事件的完整信息",包括协程创建/结束、堵塞(系统调用、通道、锁)、网络I/O、系统调用、GC相关事件;21.5节说明"在trace的初始阶段需要首先STW,然后获取协程的快照、状态、栈帧信息……运行时源码中每个重要的事件处都加入了判断trace.enabled是否开启的条件",因此可以推出"trace 靠运行时插桩记录完整时序事件,采集本身有 STW 和写入开销"的结论。 - 原始内容:这就是在Go1.5之后推出的trace工具的强大之处,它提供了指定时间内程序发生的事件的完整信息,这些事件信息包括:◎协程的创建、开始和结束。◎协程的堵塞——系统调用、通道、锁。◎网络I/O相关事件。◎系统调用事件。◎垃圾回收相关事件……在trace的初始阶段需要首先STW,然后获取协程的快照、状态、栈帧信息,接着设置trace.enable=true开启GC……Go语言在运行时源码中每个重要的事件处都加入了判断trace.enabled是否开启的条件,并编译到了程序中,当trace开启后,会触发traceEvent写入事件。