炼数成金 门户 大数据 Python 查看内容

Py-Spy:Python程序的抽样分析器

2018-9-25 09:31| 发布者: 炼数成金_小数| 查看: 22217| 评论: 0|原作者: 赵四妹 译|来自: Python程序员

摘要: Py-Spy是Python程序的抽样分析器。 它允许您可视化Python程序正花费时间在哪部分,而无需重新启动程序或以任何方式修改代码。 Py-Spy的开销极低:它使用Rust语言编写,速度快,不会在与配置的Python程序相同的进程中 ...

Python 安全 Hadoop Linux 可视化

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)


默认的可视化是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下运行

有关详细信息,请访问: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文件以获取全文。

英文原文:https://github.com/benfred/py-spy 

声明:文章收集于网络,如有侵权,请联系小编及时处理,谢谢!

欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708

Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967 

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2018-12-11 19:56 , Processed in 0.138777 second(s), 24 queries .