Go 语言学习:pprof采样过程与原理 | 豆包MarsCode AI刷题

44 阅读2分钟

Go 语言学习:pprof采样过程与原理

CPU

采样对象

  • 函数调用和它们占用的时间

采样率

  • 100Hz(不可修改)

采样时间

  • 手动启动到手动结束

流程

  1. 进程注册SIGPROF信号处理函数,然后启动定时器;
  2. 操作系统每隔10ms想进程发送SIGPROF信号;
  3. 进程在信号处理函数将调用栈信息写入到写缓冲中;
  4. 每隔100ms写缓冲将缓冲信息写入到输出流;
  5. 采样结束,取消信号处理函数的注册,关闭定时器

Heap内存

采样对象

  • 记录通过内存分配器在堆上分配和释放的内存的大小和数量

采样率

  • 512KB(可修改,1表示只要分配就记录)

采样时间

  • 程序运行开始到结束

采样指标

  • alloc_space,alloc_objects,inuse_space,inuse_objects (alloc已分配,inuse已使用)

Goroutine协程和ThreadCreate线程创建

采样对象

  • Goroutine:记录所有用户发起且在运行中的goroutine(入口非runtime开头的)runtime.main调用栈信息
  • ThreadCreate:记录程序创建的所有系统线程的信息

采样流程

  • Goroutine: Stop The World -> 遍历allg切片 -> 输出创建g的堆栈 -> Start The World
  • ThreadCreate: Stop The World -> 遍历allm链表 -> 输出创建m的堆栈 -> Start The World

Stop The World表示所有goroutine暂停

Block-阻塞 & Mutex-锁

采样对象

  • 阻塞:采样阻塞操作的次数和耗时
  • 锁:采样争抢锁的次数和耗时

采样率

  • 阻塞:阻塞耗时超过阈值后记录,1表示每次都记录
  • 锁:只记录固定比例的锁操作,1为每次加锁均记录

采样流程

  • 阻塞:阻塞操作-> Profiler分析阻塞时间 -> 超过阈值则记录 -> 统计阻塞次数和耗时
  • 锁:锁竞争 -> Profiler分析消耗时间 -> 比例命中则记录 -> 统计竞争次数和耗时