当前位置: 首页 > 后端技术 > Python

漫画:如何分析正在运行的Python程序?

时间:2023-03-26 17:12:57 Python

简介如何使用py-spy如何理解火焰图遇到的问题老板组长透露了几个关键信息:1.在线运行的Python程序要检查2.》3点早上3.问题现象是程序卡死,重启后线上服务器可能在真实环境下正常运行,使用真实数据运行了很长时间,性错误通常很难发现测试服务器或者灰度服务器,一般通过查看这个错误的日志很难判断出这个问题的真正原因,可能是其他代码有问题,但是没有处理,导致状态不正常。堆积,一段时间后才会出现的问题。根据以上关键信息,我开始思考如下:1.思考是否可以构建一个“可复现的最小实例?”,如果可以复现,说明问题已经找到2.是代码问题还是其他依赖服务的问题导致了这个Python程序的问题?我在测试环境中运行相同的代码,没有发现任何问题。是不是其他依赖的问题?依赖的服务那么多,一个一个去查是不现实的,只能在代码里多加日志,然后放到网上看?其实还有一个更简单的定位错误的方法,那就使用py-spy使用py-spypy-spy是一款开源的Python程序采样分析工具,使用py-spy可以非常直观的查看Python程序的进程栈以及不同方法的耗时,整个监控方法不需要对正在运行的程序做任何处理,即不需要修改程序代码,也不需要重启程序。py-spy是使用Rust语言开发的。Rust语言是一门以C/C++的运行速度和类JavaScript编写着称的语言。简单来说就是开发效率高,运行效率高。py-spy基于Rust语言提供的强大特性,使其可以安全地用于生产环境中的python程序。通过pip安装py-spypip3install-ihttps://pypi.doubanio.com/simple/py-spy安装后即可使用。如果你是windows用户,需要下载预建的二进制文件进行安装。参考官方说明(在最后的参考部分)。通过py-spyhelp查看工具支持的命令。一共有3条不同的命令,非常简单。首先我们使用top命令,它会产生类似于Unix系统中top命令的效果。它可以以两种方式使用,如下所示。#如果python程序正在运行,直接通过pid采样sudopy-spytop--pid12345#或者#如果python程序没有运行,可以使用下面的命令sudopy-spytop--pythonmyprogram.py因为在线Python服务的本身就是运行状态,所以可以直接通过pid查看运行进程中的信息,这些信息会根据py-spy的采样实时更新。从上图可以看出,top命令会显示GIL锁使用率、活跃线程率、当前Python进程线程数等整体信息。此外,它还会列出程序中不同方法的占用时间。该信息包括第三方库使用的时间。另外,你也可以让py-spy生成一个火焰图(flamegraph),通过它你可以更直观的判断程序的性能。py-spy只需要使用record命令生成火焰图,和top命令类似,也有两种使用方式,如下。py-spyrecord-oprofile.svg--pid12345#或者py-spyrecord-oprofile.svg--pythonmyprogram.py-o参数用于指定生成火焰图的路径。如果你不会看懂火焰图,不要紧张,后面会介绍火焰图的用法。如果你的程序突然卡住了,你也不知道为什么卡住了,你可以使用py-spy的dump命令查看当前程序的调用栈,根据调用栈来判断Python程序挂在了哪里。dump命令只能与正在运行的Python程序一起使用。py-spydump--pid12345从图中我们可以清楚的看到当前Python程序中所有活跃线程的调用栈。添加更多的--locals参数还可以打印出每个栈帧关联的局部变量,如下图所示。介绍了py-spy的简单使用。了解火焰图火焰图通常是svg图像,可以直接通过Chrome浏览器打开。py-spy生成的火焰图是向下的,而有些工具生成的火焰图是向上的。风格不同,但没有本质区别。看刚才py-spy生成的火焰图。火焰图的y轴代表程序的调用栈。每一层都是一个功能。调用堆栈越深,火焰越高。最下面是当前正在执行的函数,它的父函数在最上面。火焰图的x轴表示样本数。如果一个函数在x轴上占据的宽度越宽,说明它被采样程序采样的次数越多,也就意味着该方法的执行时间越长。需要注意的是,火焰图的x轴并不代表时间,而是将所有调用栈合并,并按字母顺序排列。此外,火焰图的颜色没有特殊含义。火焰图是交互式的。1.鼠标悬停当鼠标悬停在火焰的某一层上时,火焰图会显示当前层对应的完整函数名称、采样次数、占总采样次数的百分比。2.您可以点击放大查看。你可以点击火焰的一层,火焰图会横向放大,图层会填满x轴,从而显示图层的详细信息。3.可以搜索。单击火焰图中的搜索以显示搜索框。用户可以输入关键字或正则表达式,所有满足条件的函数名都会高亮显示。实际上,Chromme浏览器本身在访问某个网站时就可以生成性能火焰图。打开开发者工具->切换到“性能”->点击“记录”按钮开始记录数据,此时访问github.com,等待网页完全加载完毕,停止记录,此时开发者tools会显示一个时间轴,下面是一个火焰图。通过这个火焰图,可以详细分析当前页面的性能。与传统的火焰图不同,x轴是时间轴,而不是样本数。参考1.py-spygithub:https://github.com/benfred/py...2.如何读取火焰图?:https://www.ruanyifeng.com/bl...