Go 语言学习:pprof采样过程与原理
CPU
采样对象
- 函数调用和它们占用的时间
采样率
- 100Hz(不可修改)
采样时间
- 手动启动到手动结束
流程
- 进程注册SIGPROF信号处理函数,然后启动定时器;
- 操作系统每隔10ms想进程发送SIGPROF信号;
- 进程在信号处理函数将调用栈信息写入到写缓冲中;
- 每隔100ms写缓冲将缓冲信息写入到输出流;
- 采样结束,取消信号处理函数的注册,关闭定时器
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分析消耗时间 -> 比例命中则记录 -> 统计竞争次数和耗时