181、py-spy 生产环境采样:无侵入 CPU 采样、火焰图生成与线上问题快速定位
181、py-spy 生产环境采样:无侵入 CPU 采样、火焰图生成与线上问题快速定位
上周五晚上十一点,线上告警突然炸了——某个Python服务的CPU飙到800%,但所有业务日志都正常,没有报错,没有慢查询,连个异常堆栈都找不到。我盯着top命令里那个疯狂跳动的python进程,心里只有一个念头:要是能钻进这个进程里看看它在干什么就好了。
这时候py-spy就是那个“钻进去”的工具。它不需要改代码,不需要重启服务,甚至不需要目标进程安装任何依赖。它直接读取/proc/pid/mem和/proc/pid/maps,用ptrace系统调用挂上去采样,完事了自动退出,对业务零影响。
安装与基本用法
pip install py-spy或者用pipx隔离安装,我习惯这样,免得污染全局环境。
pipx install py-spy最常用的命令就两个:top和record。前者实时看CPU热点,后者生成火焰图。
py-spy top --pid 12345这个命令会像Linux的top一样,实时刷新当前进程里每个Python函数的CPU占用百分比。注意它显示的是Python函数级别的调用栈,不是C级别的。如果你看到一堆<built-in method>,说明你的热点在C扩展层,这时候得用perf或者火焰图进一步分析。
