Hasty Briefsbeta

双语

Understanding the Go Runtime: Profiling

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