py-spy top 显示目标进程 CPU 一直是 0%,同一时刻 top 里这个进程占着三百多,采出来全是空白帧。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

docker run --cap-add=SYS_PTRACE ...
py-spy top --pid 1234 --rate 100
py-spy record -o profile.svg --pid 1234

容器里没有 ptrace 权限,附加失败只在开头提示一次,之后照常输出空采样,看起来就像进程在空转,实际是采样器根本没读到目标进程的调用栈。这一点先确认清楚,后面就不用反复试。

「py-spy 采样失败」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,确认容器加了 ptrace 能力或关闭相关限制;先在宿主机上附加一次排除环境问题;采样时避开阻塞模式减少对目标的影响。

改完照着核一遍,采样出的热点函数和 top 里的 CPU 占比能对上,不再是空白帧。

作者 9823189