当前位置: 首页 > news >正文

py-spy:不改动代码就能分析 Python 性能

文章目录

  • py-spy:不改动代码就能分析 Python 性能
    • 三个命令覆盖日常需求
    • 跨平台和多版本支持
    • 工作原理
    • 权限相关
    • 什么时候用它

py-spy:不改动代码就能分析 Python 性能

Python 程序跑得慢,定位瓶颈是个常见需求。常规做法是在代码里插入分析逻辑,或者重启程序挂上分析器。py-spy 提供了一条不同的路径:直接读取运行中的 Python 进程,不用改一行代码,也不用重启服务。

这个项目用 Rust 写成,核心目标是低侵入。它不和被分析的 Python 进程跑在同一个空间里,而是通过操作系统提供的内存读取接口,直接采样目标进程的调用栈。这意味着你可以在生产环境直接用它,对正在服务的程序影响极小。

三个命令覆盖日常需求

py-spy 的命令行接口很简洁,只有三个子命令。

record用于生成性能报告。指定目标进程的 PID,或者直接跟 Python 命令,它会持续采样并输出火焰图 SVG 文件。输出格式也支持 speedscope 和原始数据,方便用其他工具二次分析。

top提供一个实时视图,类似系统自带的 top 命令,但显示的是 Python 层面的函数耗时排名。适合快速定位当前最热的代码路径。

dump则是一次性输出所有线程的调用栈。程序卡住的时候,用这个命令看一眼各线程停在哪儿,往往就能定位问题所在。

跨平台和多版本支持

py-spy 支持 Linux、macOS、Windows 和 FreeBSD。Python 版本覆盖 2.3 到 2.7,以及 3.3 到 3.14。这个范围相当宽, legacy 项目和新项目都能用。

安装方式也灵活。PyPI 上有预编译的 wheel,一条 pip 命令就能装好。macOS 用户可以用 Homebrew,Arch Linux 用户可以从 AUR 安装。如果你是 Rust 开发者,也可以直接 cargo install 从源码编译。

工作原理

py-spy 直接读取目标进程的内存来还原 Python 调用栈。在 Linux 上通过 process_vm_readv,macOS 上用 vm_read,Windows 上用 ReadProcessMemory。

具体做法是:先找到 PyInterpreterState 的位置,拿到所有线程列表,再逐个遍历 PyFrameObject 来还原调用链。由于 CPython 的内存布局随版本变化,项目用 bindgen 为每个支持的版本生成对应的 Rust 结构体,确保能正确解析。

ASLR(地址空间布局随机化)会带来一些麻烦。如果 Python 解释器带有符号表,可以直接从 interp_head 或 _PyRuntime 变量定位解释器地址。但很多发行版会剥离符号,这时 py-spy 会扫描 BSS 段,寻找符合 PyInterpreterState 特征的内存地址。

权限相关

读取其他进程的内存通常需要特定权限。macOS 上必须 root 运行。Linux 的默认配置更细:如果由 py-spy 启动目标进程,一般不需要 root;但附加到已有进程通常需要 sudo。这个限制可以通过调整 ptrace_scope 参数来放宽。

Docker 和 Kubernetes 环境里也常见权限问题,需要给容器添加 SYS_PTRACE 能力。文档里对这些场景都有具体说明。

什么时候用它

如果你需要分析一个已经在跑的 Python 服务,又不想重启或修改代码,py-spy 是个直接的选择。它的开销足够低,对线上服务的影响在可接受范围内。

火焰图输出对理解程序热点很直观。GIL 检测功能可以帮你判断多线程程序里哪些线程在争用全局锁。子进程分析功能则对用了 multiprocessing 或 gunicorn 的架构有用。

这个项目目前有 15,236 个 Star,解决的是一个具体的工程问题:在生产环境安全地分析 Python 性能。

,236 个 Star,解决的是一个具体的工程问题:在生产环境安全地分析 Python 性能。

http://www.zskr.cn/news/1483405.html

相关文章:

  • F28335 DSP驱动AD7606避坑指南:从原理图焊接到CCS代码调试的完整流程
  • 从‘旋转时钟’到‘整数模n’:手把手用Python代码验证群同构与同态(附完整代码)
  • 告别ifup/ifconfig:Ubuntu 18.04+网络配置,用Netplan这一篇就够了(含YAML避坑指南)
  • 北京GEO优化哪家靠谱?2026主流服务商横向对比与选型指南
  • Almanac:基于行动层面的智能体协作心智模型标注数据集与行为预测基准
  • 保姆级教程:用OpenCV+Python一步步搞定双目相机标定与三维重建
  • Proteus仿真中PCF8574驱动LCD1602的5个常见坑点及解决方法
  • uniapp小兔新儿day2
  • 别再让数据裸奔了!手把手教你为Hadoop HDFS 3.x配置透明加密(附KMS避坑指南)
  • 在AutoDL云服务器上无图形界面安装Matlab 2018b:一份给深度学习研究者的保姆级教程
  • AD20库管理实战:从零创建一个带3D封装的STM32芯片集成库
  • KMS智能激活终极指南:5分钟永久激活Windows和Office的完整教程
  • 打通资产数据壁垒,固定资产管理系统实现全流程数字化
  • 大模型微调避坑指南:LoRA/QLoRA 从数据清洗到部署的实战全录
  • 在Windows电脑上畅享酷安社区:Coolapk UWP桌面版完全指南
  • Agent模型冷启动问题
  • 管理思维:抓大放小
  • 2026年大同离婚律师哪家好?5位专业实力值得推荐 - 本地品牌推荐
  • 避坑指南:RuoYi-flowable从源码构建到Docker镜像打包的完整流程(附Node版本与Java依赖问题解决)
  • 从大模型基础到视觉 Transformer
  • 2026年常州遗产继承纠纷律师怎么选?看这三点关键不踩雷 - 本地品牌推荐
  • STC15单片机实战:用IIC驱动LCD1602,告别繁琐的8位并行线(附Proteus仿真文件)
  • 别再手动部署了!用Docker Compose一键搞定RuoYi-flowable工作流系统(含Node版本避坑指南)
  • 灭蟑螂服务口碑哪家好,河南洁管家靠谱吗? - myqiye
  • 2026年ISO认证申请流程揭秘,恒业咨询解读! - myqiye
  • 【深度解析】从 Oceanus 泄露事件看前沿大模型的代码推理、自动化安全测试与治理挑战
  • Seata 1.4.2 启动报错排查指南:内存调整、建表遗漏与Nacos配置导入的那些坑
  • 从光影到物理渲染:Substance Sampler 照片转材质
  • 2026年空气净化器哪家靠谱? - myqiye
  • C语言多线程编程踩坑记:pthread_create传参类型不匹配的三种修复方案