本文永久链接: https://www.xtplayer.cn/etcd/etcd-pprof-performance-analysis/

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 安装

为了方便,我们制作了 tools 工具包镜像 registry.cn-shenzhen.aliyuncs.com/rancher/tools,此镜像内置了 go pprof tool,以及常用的系统维护,网络维护工具。

go pprof tool 安装参考:https://github.com/google/pprof#building-pprof

https://github.com/xiaoluhong/kubernetes-issues-solution/blob/master/tools/Dockerfile

etcd 启用 pprof

接下来以 etcd 性能分析为例。

对于 rancher 自定义集群或者 rke 集群,默认没有开启 pprof 分析功能。可在集群配置或者 rke 配置文件中添加 extra_env ETCD_ENABLE_PPROF=trueextra_args enable-pprof: true,两个参数二选一。其他类型的 K8S 集群,可以在 etcd 的启动参数中添加 ETCD_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 查看 pprof Web 界面,点击 VIEW 查看不通的视图。