Understanding the Go Runtime: Profiling
6 days ago
- #Performance Analysis
- #Runtime Internals
- #Go Profiling
- reflect包使用编译时生成的类型描述符,而性能剖析通过调用栈捕获运行时数据。
- Go提供五种剖析类型(CPU、堆、阻塞、互斥锁、协程),它们共享基于简单协议缓冲区结构的pprof格式。
- 剖析数据共享通用骨架并采用间接引用:样本引用位置,位置引用函数,函数引用共享表中的字符串以实现高效存储。
- CPU剖析使用异步信号驱动的采集方式,通过环形缓冲区避免处理程序中的内存分配和锁竞争。
- 堆、阻塞和互斥锁剖析采用原地聚合方式,将数据存入以调用栈为键的哈希表(桶)中,由特定运行时事件触发。
- 堆剖析基于随机比率对内存分配进行采样,通过缩放计数估算总量,并跟踪存活对象与已分配对象的对比。
- 阻塞和互斥锁剖析记录竞争事件,采用按持续时间或随机比例的选择性采样,并通过缩放数值估算真实总量。
- 协程剖析按需获取所有存活协程的快照,采用协作式方法避免长时间的全局暂停。
- 所有剖析最终生成相同的pprof文件格式,差异仅在于调用栈的捕获时机和聚合方式。