pprof 是什么?
pprof 是用于可视化的性能分析工具,可以捕捉到多维度的运行状态的数据。
pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)。
profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式。
支持什么模式
- Report generation:报告生成
- Interactive terminal use:交互式终端使用
- Web interface:Web 界面
可以做什么
- CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
- Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
- Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
- Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况
GO pprof tool 安装
registry.cn-shenzhen.aliyuncs.com/rancher/tools
etcd 启用 pprof
接下来以 etcd 性能分析为例。
extra_env ETCD_ENABLE_PPROF=trueextra_args enable-pprof: trueETCD_ENABLE_PPROF=true--enable-pprof=true
services:
etcd:
extra_args:
max-request-bytes: 10485760
snapshot-count: 50000
log-level: info # supports debug, info, warn, error, panic, or fatal.
debug: false
# enable-pprof: true
backup_config:
interval_hours: 12
retention: 6
extra_env:
- ETCD_ENABLE_PPROF=true
性能分析
对于 rancher 自定义集群或者 rke 集群,默认开启了 etcd 双向认证,那么在进行 pprof 查看数据的时候,需要提供客户端 ssl 证书。可以直接通过挂载卷(-v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/:ro)的方式把主机证书目录挂载到 tools 容器中。
获取应用当前的内存情况
NODE_IP='192.168.1.224'
docker run --rm -ti -p 10086:10086 -e NODE_IP=${NODE_IP} \
-v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/:ro \
registry.cn-shenzhen.aliyuncs.com/rancher/tools \
pprof \
-tls_ca /etc/kubernetes/ssl/kube-ca.pem \
-tls_cert /etc/kubernetes/ssl/kube-etcd-`echo ${NODE_IP}|sed 's/\./-/g'`.pem \
-tls_key /etc/kubernetes/ssl/kube-etcd-`echo ${NODE_IP}|sed 's/\./-/g'`-key.pem \
-http=0.0.0.0:10086 https://`echo ${NODE_IP}`:2379/debug/pprof/heap
采集应用 60s 内的 cpu 使用情况
NODE_IP='192.168.1.224'
docker run --rm -ti -p 10086:10086 -e NODE_IP=${NODE_IP} \
-v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/:ro \
registry.cn-shenzhen.aliyuncs.com/rancher/tools \
pprof \
-tls_ca /etc/kubernetes/ssl/kube-ca.pem \
-tls_cert /etc/kubernetes/ssl/kube-etcd-`echo ${NODE_IP}|sed 's/\./-/g'`.pem \
-tls_key /etc/kubernetes/ssl/kube-etcd-`echo ${NODE_IP}|sed 's/\./-/g'`-key.pem \
-http=0.0.0.0:10086 https://`echo ${NODE_IP}`:2379/debug/pprof/profile
采集当前 goroutine 情况
NODE_IP='192.168.1.224'
docker run --rm -ti -p 10086:10086 -e NODE_IP=${NODE_IP} \
-v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/:ro \
registry.cn-shenzhen.aliyuncs.com/rancher/tools \
pprof \
-tls_ca /etc/kubernetes/ssl/kube-ca.pem \
-tls_cert /etc/kubernetes/ssl/kube-etcd-`echo ${NODE_IP}|sed 's/\./-/g'`.pem \
-tls_key /etc/kubernetes/ssl/kube-etcd-`echo ${NODE_IP}|sed 's/\./-/g'`-key.pem \
-http=0.0.0.0:10086 https://`echo ${NODE_IP}`:2379/debug/pprof/goroutine
数据查看
主机 IP:10086