这是我参与「第五届青训营 」伴学笔记创作活动的第7天
工作原理
性能样本数据采集
在性能样本数据采集过程中,pprof 搜集被分析程序在运行时的一系列的性能概要信息的采样数据,并根据产生的采样数据生成 pprof 可视化工具可以解析的数据格式。
样本数据分析
pprof 工具本身提供了命令行工具,可以对采集到的样本数据进行可视化和性能分析。 对于go程序来说,主要关注CPU、内存、Block、goroutine等性能指标。
CPU
- 采样对象:函数调用与其占用时间
- 采样率:100次/秒,固定值
- 采样时间:从手动启动到手动结束
在采样时,进程会每秒暂停100次,每次会记录当前的调用栈信息。汇总之后,根据调用栈在采样中出现的次数来推断函数运行时间,这个定时暂停机制在unix或类unix系统上是根据信号机制实现的
每次暂停都会收到一个信号,通过系统计时器保证信号是固定频率发送的
CPU
- 操作系统:每10ms向进程发送一次sigprof信号
- 进程:每次收到sigprof会记录调用堆栈
- 写缓冲:每100ms读取已经记录的调用栈并写入输出流
启动采样时,进程向OS注册一个定时器,OS会每隔10ms向进程发送一个SIGPROF信号,进程接收到信号后就会对当前的调用浅进行记录。 与此同时,进程会启动一个写缓中的goroutine,它会每隔100ms从进程中读取已经记录的堆栈信息,并写入到输出流。 当采样停止时,进程向OS取消定时器,不再接收信号,写缓冲读取不到新的堆栈时,结束输出。
堆内存
- 采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量
- 采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
- 采样时间:从程序运行开始到采样时
- 采样指标:alloc_space,alloc_objects,inuse_space,inuse_objects
- 计算方式:inuse=alloc-free
Goroutine
Goroutie采样会记录所有用户发起,也就是入口不是runtime开头的goroutine以及main函数所在goroutine的信息和创建这些goroutine的调用栈。 会在STW之后,遍历所有goroutine/所有线程的列表)并输出堆栈,最后Start The World继续运行。