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

 

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默认情况下会丢弃该功能,从而导致错误

图1-1.jpg

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

图1-2.jpg

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

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微观世界探索者:15家值得关注的纳米技术公司

来源:资本实验室摘要:纳米技术就像微观世界的魔术,让人类得以前所未有地深入到物质的分子与原子层面,探索生物、化学、物理等各领域的融合。资本实验室今日投资关注聚焦前沿科技创新与传统产业升级纳米技术就像微观世界的魔术&…

Python 异步 redis

现在的 Python 的异步 redis,有三种( aredis 、aioredis、asynio_redis) aredis 、aioredis、asynio_redis 对比 From:https://zhuanlan.zhihu.com/p/24720629 aioredis 要求装上 hiredis , 而 aredis 可以不需要相关依赖地运行&…

AspNetPager 修改 然后返回当前页

昨天碰到一个问题需要修改了 然后然后当前选中页面 这个问题应该很简单 也就是传值问题 根据自己的需求而决定 在返回的时候数据是当前的数据但是不在选中的页号 纠结了很长时间 请求别人帮助终于发现问题 原来是 Pager.CurrentPageIndex没有设定 大家应该认为我是不是很马虎 …

DeepMind新论文:给侧面照片,AI给你脑补出正面

来源:澎湃新闻摘要:大家在学生时代可能都面对过这些涉及空间想象的几何题。从根本上,它们考验的是2D图像和3D场景间的转换能力。如今,人工智能也成功打破了这种“次元壁”。用小立方体搭一个几何体,使它的主视图和俯视…

安卓逆向 和 手游辅助 学习 路线

From:https://zhuanlan.zhihu.com/p/95915254 知乎:Android 逆向分析学习路线?:https://www.zhihu.com/question/25626303 入门篇 --- 学习Android安全和逆向开发的路线总结:https://www.52pojie.cn/thread-1065039-…

对 带头结点的单链表 的操作

//带头结点的单链表#include<iostream>using namespace std;typedef struct student{int data;struct student *next;}node;node * creat() //创建单链表{node *head,*p,*s;int x,cycle1;head(node *)malloc(sizeof(node));phead;while(cycle){…

可交互的对抗网络如何增强人类创造力?

编译&#xff1a;集智翻译组来源&#xff1a;distill.pub作者&#xff1a;Shan Carter&#xff0c;Michael Nielsen原题&#xff1a;Using Artificial Intelligence to Augment Human Intelligence摘要&#xff1a;计算机不仅可以是解决数学问题的工具&#xff0c;还可以是拥有…

[转载] 本能

新浪影音娱乐&#xff1a;http://data.ent.sina.com.cn/movie/3819.html 转载于:https://www.cnblogs.com/6DAN_HUST/archive/2011/08/04/2126907.html

ARM 寄存器 详解

From&#xff08; ARM 寄存器详解 &#xff09;&#xff1a;https://blog.csdn.net/sandeldeng/article/details/52954781 ARM 汇编基础教程&#xff1a;2.数据类型和寄存器&#xff1a;https://www.52pojie.cn/thread-797306-1-1.html ARM 的 寄存器 ARM 工作状态 和 工作模式…

让AI个性化而且功耗更低 IBM研发新型神经网络芯片

选自&#xff1a;Singularity Hub编译&#xff1a;网易智能参与&#xff1a;李擎摘要&#xff1a;在GPU上运行的神经网络已经在人工智能领域取得了一些惊人的进步&#xff0c;但这两者的合作还并不完美。IBM的研究人员希望能设计出一种专门用于运行神经网络的新的芯片&#xff…

Net C# 扩展方法

Net C# 扩展方法扩展方法使您能够向现有类型“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法&#xff0c;但可以像扩展类型上的实例方法一样进行调用。好处&#xff1a;不修改原有类型的实现调用&#xff1a…

豆瓣 音乐和读书的搜索页的 window.__DATA__ 的解密

豆瓣读书搜索页的 window.__DATA__ 的解密&#xff1a;https://www.jianshu.com/p/ac8b81950a73 豆瓣的 音乐搜索 和 读书搜索&#xff0c;返回的网页源码都有 window.__DATA__ &#xff0c;这是 js 加密 之后的数据 具体分析 参考 &#xff1a;https://www.jianshu.com/p/ac8…

每日一题——LeetCode888

方法一 个人方法&#xff1a; 交换后要达到相同的数量&#xff0c;那么意味着这个相同的数量就是两个人总数的平均值&#xff0c;假设A总共有4个&#xff0c;B总共有8个&#xff0c;那么最后两个人都要达到6个&#xff0c;如果A的第一盒糖果只有1个&#xff0c;那么B就要给出6…

“真”5G标准出炉!不止是速度,这些难以置信的改变将彻底颠覆你的生活

来源&#xff1a;传球创新论坛摘要&#xff1a;5G时代又离我们近了一大步。6月14上午11时许&#xff0c;3GPP批准了第五代移动通信标准5G NR独立组网&#xff08;SA&#xff09;的冻结&#xff0c;这意味着首个完整意义的国际5G标准正式确立。未来&#xff0c;5G技术将成为和电…

写在囧男囧女们的七夕节

写在囧男囧女们的七夕节 当我们发现某些节日已经远离我们时&#xff0c;我们往往会以幽默的方式&#xff0c;让自己无厘头地般地分享节日的快乐 。比如&#xff0c;每年的六月一日&#xff0c;不管童年已经离我们多遥远&#xff0c;见朋友或同事就来上一句“节日快乐”&#xf…

安卓逆向_16 --- ARM 静态分析( 使用 IDA Pro 分析 ARM 汇编【java_ 和 JNI_OnLoad】 )

菜鸟总结 so 分析&#xff0c;arm 汇编&#xff0c;IDA 静态分析&#xff1a;https://www.52pojie.cn/thread-695063-1-1.html JNI 静态注册 so 和 IDA 导入的 JNI.h 文件.zip&#xff1a;https://download.csdn.net/download/freeking101/12571373 ARM 静态分析&#xff1a; …

人脑的前世今生

来源&#xff1a;科学网摘要&#xff1a;人类的神奇常常归结于一个智慧的大脑以及贯穿于其中的无比复杂的神经网络&#xff0c;并认为这源自上帝之手&#xff0c;但其实它并不是无中生有的&#xff0c;而是自然演化的产物&#xff0c;虽然是一个无与伦比的杰作&#xff0c;但人…

Web在线操作Office之Word

最近公司有个项目&#xff0c;需要直接在IE浏览器中操作Word文档&#xff0c;随后在网上搜了一些资料&#xff0c;感觉都不是很理想。不过&#xff0c;最后还是找到了一个 功能比较强的控件&#xff0c;是老外开发的控件&#xff0c;需要注册。还好&#xff0c;没有注册时&…

安卓逆向_17 --- IDA 动态调试【 环境搭建、so库调试【动态普通、动态debug模式】、JNI_OnLoad调试分析、java_ 开头函数分析】

哔哩哔哩视频&#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p54 IDA Pro调试so&#xff0c;附加完毕&#xff0c;跳到目标so基址&#xff0c;但是内容都是DCB伪指令&#xff1f;&#xff1a;https://bbs.pediy.com/thread-222646.htm Android 中 adb shell ps 查…

2018全球科技创新报告

来源&#xff1a;199IT互联网数据中心摘要&#xff1a;毕马威报告显示&#xff0c;我们如今正处在一个科技创新爆发的时代&#xff0c;对于科技企业来说&#xff0c;现在不是害怕失败或是裹足不前的时候。毕马威报告显示&#xff0c;我们如今正处在一个科技创新爆发的时代&…