From:https://python.freelycode.com/contribution/detail/1320

GitHub 地址:https://github.com/benfred/py-spy

Py-Spy 是 Python 程序的抽样分析器。 它允许您可视化 Python 程序正花费时间在哪部分,而无需重新启动程序或以任何方式修改代码。 Py-Spy 的开销极低:它使用 Rust 语言编写,速度快,不会在与配置的 Python 程序相同的进程中运行,也不会以任何方式中断正在运行的程序。 这意味着 Py-Spy 可以安全地用于生产环境的 Python 代码。

Py-Spy 适用于Linux,OSX 和 Windows,并支持分析所有最新版本的 CPython 解释器(版本2.3-2.7和3.3-3.7)

安装

可以从 PyPI 安装预构建的二进制 wheel 格式文件:pip install py-spy

用法

py-spy 在命令行中工作,并获取要从中取样的程序的 PID 或要运行的 python 程序的命令行:

默认的可视化是python程序的类似top命令输出的实时视图:

还支持从运行过程生成火焰图:

这将生成一个SVG文件,如下所示:

通过将 --dump 传递给命令行,还可以为每个线程转储当前的调用堆栈。

经常问的问题

为什么我们需要另一个Python分析器?

该项目旨在让您分析和调试任何正在运行的Python程序,即使该程序正在为生产流量提供服务。

虽然还有许多其他python分析项目,但几乎所有项目都需要以某种方式修改被分析的程序。 通常,分析代码在目标python进程内部运行,这将减慢并改变程序的运行方式。 这意味着使用这些分析器来调试生产服务中的问题通常不安全,因为它们通常会对性能产生显着影响。 唯一一个完全在单独进程中运行的Python探查器是pyflame,它通过使用ptrace系统调用来描述远程python进程。 虽然pyflame是一个很棒的项目,但它还不支持Python 3.7,并且不适用于OSX或Windows。

py-spy如何运作?

Py-spy通过使用Linux上的process_vm_readv系统调用,OSX上的vm_read调用或Windows上的ReadProcessMemory调用直接读取python程序的内存。

通过查看全局PyInterpreterState变量来获取Python程序的调用堆栈,以获取在解释器中运行的所有Python线程,然后迭代每个线程中的每个PyFrameObject以获取调用堆栈。 由于Python ABI在不同版本之间发生变化,我们使用rusts的bindgen为我们关心的每个Python interperator类生成不同的rust结构,并使用这些生成的结构来计算Python程序中的内存布局。

由于地址空间布局随机化,获取Python解释器的内存地址可能有点棘手。 如果目标python解释器带有符号,则通过取消引用interp_head或_PyRuntime变量(取决于Python版本),很容易找出解释器的内存地址。 但是,许多Python版本附带了剥离的二进制文件,或者在Windows上没有相应的PDB符号文件。 在这些情况下,我们通过BSS部分扫描看起来像是指向有效PyInterpreterState的地址,并检查该地址的布局是否符合我们的预期。

py-spy配置文件原生扩展?

由于我们通过查看PyInterpreterState来获取python程序的调用堆栈,我们还没有获得有关非python线程的信息,也无法分析像Cython或C ++等语言编写的本机扩展。 本机代码将显示为在调用本机函数的Python行中花费时间,而不是现在它自己的条目。

应该可以使用libunwind之类的东西来分析Python Extensions中的原生代码。 如果这是你感兴趣的事情,请提出这个问题。

你什么时候需要以sudo身份运行?

Py-spy通过从不同的python进程读取内存来工作,出于安全原因,这可能不允许,具体取决于您的操作系统和系统设置。 在许多情况下,以root用户(使用sudo或类似用户)运行可以解决这些安全限制。 OSX总是需要以root身份运行,但在Linux上它取决于你如何启动py-spy和系统安全设置。

在Linux上,默认配置是在附加到非子进程时需要root权限。 对于py-spy,这意味着您可以通过使用py-spy来创建进程(py-spy -- python myprogram.py)从而不需要root权限来分析,但通过指定PID附加到现有进程通常需要root(sudo py-spy -pid 123456)。 您可以通过设置ptrace_scope sysctl变量来消除linux对此的限制。

在Kubernetes下运行

py-spy需要SYS_PTRACE才能读取进程内存。 Kubernetes默认情况下会丢弃该功能,从而导致错误

处理此问题的推荐方法是编辑规范和所有功能。 对于部署,可以通过将此添加到Deployment.spec.template.spec.containers来完成

有关详细信息,请访问:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container

请注意,这将删除现有的pod并再次创建。

为什么我在OSX上分析/usr/bin/python时遇到问题?

OSX有一个称为系统完整性保护的功能,即使root用户也无法从位于/usr/bin中的任何二进制文件中读取内存。 不幸的是,这包括了OSX附带的python解释器。

有几种不同的方法可以解决这个问题:

你可以安装一个不同的Python发行版(你可能想要远离python2迁移=)

你可以使用virtualenv在SIP不适用的环境中运行系统python。

你可以禁用系统完整性保护。

你是如何通过PyPI分发Rust可执行二进制文件的?

好吧,没有人真正问过我这个 - 但我想分享,因为这是一个非常可怕的黑科技,可能对其他人有用。

我真的想通过PyPI分发这个软件包,因为使用pip进行安装会使大多数Python程序员更容易安装到他们的系统上。 不幸的是,将可执行文件安装为python脚本并不是setuptools支持的。

为了解决这个问题,我使用setuptools_rust包来构建py-spy二进制文件,然后重写distutils install命令将构建的二进制文件复制到python脚本文件夹中。 通过为所支持的平台预先构建的轮子,这意味着我们可以使用pip安装py-spy,而不需要在安装它的机器上安装Rust编译器。

这是否能在BSD上运行? 支持32位Windows? 与PyPy集成? 使用USC-16版本的Python2?

还没有=)。

可信度

py-spy受到Julia Evans在rbspy上的出色工作的启发。 特别是,生成火焰图的代码直接来自rbspy,这个项目使用从rbspy中分离出来的(read-process-memory和proc-maps)包。

许可证

Py-spy是在GNU通用公共许可证v3.0下发布的,请参阅LICENSE文件以获取全文。

Python 程序的抽样分析器 - Py-Spy相关推荐

  1. python程序打包多个py文件_不使用setup.py,打包 Python 项目

    我编写了许多开源项目,并允许其他人通过PyPI访问这些项目.为此,我需要从这些项目构建一个源代码分发版(sdist)和一个可选的wheel包,并将二者上传到PyPI.最后,这个sdist和wheel包 ...

  2. 打包python程序发布_Python代码的打包与发布详解

    在python程序中,一个.py文件被当作一个模块,在各个模块中定义了不同的函数.当我们要使用某一个模块中的某一个函数时,首先须将这个模块导入,否则就会出现函数未定义的情况. 下面记录的是打包及安装包 ...

  3. 【Python】将python程序打包成exe

    文章目录 1.PyInstaller原理 2.PyInstaller的安装 3.PyInstaller打包python程序 4.生成的exe程序 5.注意事项 1.PyInstaller原理 PyIn ...

  4. 云服务器运行python程序_云服务器部署python项目

    发现python的一个识别验证码识别模块 muggle-ocr(https://pypi.org/project/muggle-ocr/) 成功率还是可以的,打算把把部署到云服务器上 这里记录一下部署 ...

  5. 福利放送,教你如何在win10下自动运行python程序脚本

    1.准备 写一个小的python程序,如test.py 由于python执行的比较快,窗口会一闪而过,所以加入while循环保持窗口. 在和test.py文件的同文件夹下 ,新建一个.bat文件,例如 ...

  6. 编写python程序的步骤_编写python程序和运行.py文件的方法步骤

    前提:已安装好 Subliume Test 3 且已经添加好python编译系统,已安装好python3.7 一.新建一个文本文档,将后缀名改为.py 二.使用 Subliume Test 3 打开该 ...

  7. anaconda怎么运行python程序_第一个python程序,从安装python环境到人生第一个py脚本运行全过程...

    文章目录 前言一.安装python运行环境 1.官网https://www.python.org下载安装包.exe 2.安装python二.python模块下载 1.配置pip环境变量 2.下载pyt ...

  8. 【错误记录】PyCharm 运行 Python 程序报错 ( SyntaxError: Non-ASCII character ‘\xe5‘ in file x.py on line 1, but )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Y:\002_WorkSpace\PycharmProjects\APK\venv\Scripts\python.exe Y:/002_WorkSp ...

  9. 用freeze.py打包python程序成可执行程序(linux)

    用freeze.py打包python程序成可执行程序(linux) 2009-12-16 19:55:13 分类: 用freeze.py打包python程序成可执行程序(linux)    为了将一批 ...

最新文章

  1. python给用户输出提示_python3.4控制用户输入与输出的方法
  2. APScheduler 浅析
  3. k8s安装prometheus(sealos)解决grafana连接prometheus报错的问题:HTTP Error Bad Gateway
  4. Ubuntu系统目录结构
  5. 「第六篇」对于电赛,我们应该看重什么?
  6. python中的zip模块
  7. 软考网络工程师笔记-综合知识3
  8. 最先进单插槽专业绘图解决方案
  9. Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)
  10. LeetCode 5377. 将二进制表示减到 1 的步骤数
  11. 某工程质量安全监管平台验证码请求参数params加密破解
  12. 【洛谷试炼场】普及练习场——贪心
  13. 浅谈在线IDE的搭建,配置,体验
  14. 2013年4月小游戏行业网站综合影响力排名
  15. 【Redis】2. 入门篇
  16. 555低电平出发定时器
  17. mysql 不等于 符号写法
  18. mysql怎么实现表的复制粘贴_如何对MySQL数据表进行复制、表结构复制
  19. S3C2440-裸机篇-05 | S3C2440时钟体系详解(FCLK、PCLK、HCLK)
  20. CodeForces #352B.Jeff and Periods

热门文章

  1. 一文盘点PaddlePaddle官方九大自然语言处理模型
  2. 语言资源的类别、搜索与搭建策略
  3. 新媒体中的MCN机构是什么意思
  4. 论文学习7-Spam Review Detection with Graph Convolutional Networks(阿里巴巴)
  5. 七牛云注册创建oss并配置自定义域名
  6. cut命令详解(转)
  7. dm365工作笔记20130731
  8. 1_RabbitMQ初入门入门Hello消费者+生产者
  9. VS Code配置C/C++
  10. 修改结构体中成员的值