进程提前退出导致profile.svg空白或未生成,本质是目标进程未运行或采样时间不足;应先用ps aux确认进程存在,再加-d参数延长采样时长,或改用--pid直接挂载长期运行的主进程。

py-spy record 生成火焰图时进程提前退出怎么办?
常见现象是 profile.svg 文件存在但打开为空白,或根本没生成。本质不是 py-spy 失败,而是它采样的目标进程已经结束。
- 确认目标进程确实在运行:
ps aux | grep your_app,避免命令写错导致 py-spy 在子 shell 里空跑 -
py-spy record默认只采样 30 秒,对短生命周期脚本远远不够 —— 加-d 60或更长(单位秒)延长采样时长 - 若目标是 Web 服务(如 Gunicorn),别用
-- python app.py启动方式,改用--pid 12345直接挂载已运行的主进程 - 火焰图是 SVG 格式,直接双击用浏览器打开;若内容为空,先检查文件头是否含
<svg,否则说明生成中断(常因权限或进程提前退出)
py-spy top 实时监控卡在 “Waiting for process…” 怎么办?
这不是程序卡死,而是 py-spy 在轮询等待进程状态就绪。它对刚启动就退出的脚本完全不适用。
- 不要对一次性脚本(如
python migrate.py)用top模式,改用record或dump - 加
--duration 20显式限制总监控时长,防止误操作锁死终端 - 默认每秒采样一次,如需更高灵敏度可调
--rate 10(每秒 10 次),但会略微增加开销 - 如果目标用了
fork()(比如 Gunicorn 的多 worker 模式),top只监控主进程,子进程需单独指定--pid
Permission denied (os error 13) 是什么权限问题?
根本原因是 Linux 内核禁止非特权进程读取其他进程内存,py-spy 必须通过 SYS_PTRACE 能力 attach 到目标进程。
- 本地调试:临时用
sudo py-spy top --pid 12345(仅限开发机) - Docker 容器:启动时必须加
--cap-add=SYS_PTRACE -v /proc:/proc:ro - Kubernetes:Deployment 中
securityContext.capabilities.add: ["SYS_PTRACE"],且确保/proc只读挂载 - 注意
/proc/sys/kernel/yama/ptrace_scope值为 1 时,即使有 cap 也可能失败;生产环境建议保持 1,调试时临时设为 0
如何让 py-spy dump 输出真正有用的线程快照?
py-spy dump 本质是抓取所有线程当前调用栈,但默认输出容易被大量 idle 线程干扰。
立即学习“Python免费学习笔记(深入)”;
- 加
--gil只显示持有 GIL 的线程,这对定位 CPU 密集型瓶颈最有效 - 加
--locals可看到局部变量值(注意:可能泄露敏感数据,生产慎用) - 加
--subprocesses递归分析 fork 出的子进程,适合 Gunicorn/UWSGI 架构 - 如果看到一堆
<built-in method>,说明热点在 C 扩展层,此时需加--native参数才能展开分析
真实线上环境里,最易被忽略的是子进程和权限的组合陷阱:Gunicorn 主进程有 cap,worker 进程没有;K8s 里 securityContext 配了,但 /proc 挂载漏了 ro;或者 ptrace_scope 设为 1,又没配好 capabilities。这些点单独看都简单,串在一起就变成“py-spy 明明装了却连不上”。



















