标准答案
- cProfile 适合在受控环境中分析调用次数和累计时间,但有运行开销。
- py-spy 通过采样观察 CPU 栈,适合线上短时定位但仍要控制访问和采样时长。
- tracemalloc 比较 Python 对象分配来源,不能覆盖所有 C 扩展和进程 RSS。
- 性能回归要固定 Python、依赖、数据分布和流量,比较 P99、CPU、内存和下游压力。
题目解析
cProfile 使用确定性统计记录函数调用次数和耗时,适合在受控环境分析 Python 代码路径,但会带来开销;py-spy 通过采样运行进程的调用栈,适合短时间观察 CPU 热点;tracemalloc 追踪 Python 分配来源,适合比较对象分配增长。三者不是同一个维度的替代品。
服务延迟还可能来自数据库、网络、锁、事件循环排队、C 扩展或内核 I/O。tracemalloc 看不到所有 native 内存,RSS 增长不能仅凭它解释;py-spy 看到 CPU 栈也不能证明下游慢。分析结果应与 P99、event loop lag、池等待、CPU、RSS 和版本发布时间线对应。
线上采样要限定权限、时长和输出位置,避免 profile 文件泄露参数或业务数据。复现性能回归时固定 Python 版本、依赖、数据规模和并发模型,否则两次结果无法比较。
常见误区
- 误区:只跑一次 cProfile 就下结论。改正:先用请求指标定位症状,再在相同负载下选择确定性分析或采样分析。
- 误区:把 tracemalloc 的结果当成完整进程内存。改正:同时观察 RSS、native 扩展、文件映射和容器 cgroup 指标。
- 误区:把 profile 文件当普通临时文件保存。改正:限制采样权限和时长,并按敏感数据处理、加密和过期删除。