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. 洛谷 P1985 翻转棋
  2. Java蓝牙电话_Android mediaPlayer和蓝牙汽车/耳机电话
  3. linear-gradient线性渐变
  4. 解读java_Java字节码解读
  5. 网盘大战-各网盘使用测试
  6. 学python用什么软件-零基础初学python需要安装哪些软件?希望对你们有帮助
  7. Luogu P1120 小木棍 [数据加强版]
  8. php中常见的错误类型有,php中的错误类型有哪些
  9. 《Head First设计模式》第二版中译本内文彩页欣赏
  10. xml文件转json文件
  11. 程序员用python给了女友一个七夕惊喜!
  12. iPhone照片太多,如何快速搜索照片?
  13. 基于卷积神经网络进行图像分类
  14. Oracle数据库:随机查询100条数据
  15. Console线连接交换机路由器等设备
  16. 阿里云盘——多电脑实时同步文件的实现
  17. Java基础回归之注解Annotation【低仿ButterKnife实战篇】
  18. iOS开发者账号的申请
  19. 全桥DCDC输出电压和变比占空比的关系
  20. Java-可重入锁(ReentrantLock)

热门文章

  1. 阿里蚂蚁金服中间件(Java 4轮面试题含答案):Redis缓存+线程锁+微服务等
  2. 阿里P8架构师谈:分布式架构设计12精讲
  3. 论文浅尝 | Data Intelligence 已出版的知识图谱主题论文
  4. 论文浅尝 | Know-Evolve: Deep Temporal Reasoning for Dynamic KG
  5. Hadoop背景、模块介绍、架构
  6. 论文阅读课11-TEMPROB:Improving Temporal Relation Extraction with a Globally Acquired Statistical Resource
  7. 9-18 学习如何使用Python包的管理
  8. Sqring核心概念
  9. asp.net(C#)写SQL语句技巧
  10. paip.获取proxool的配置 xml读取通过jdk xml 初始化c3c0在代码中总结