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

内容简介如何使用 py-spy

如何读懂火焰图

遇到的问题

大佬组长透露出几个关键信息:1. 要排查的是线上服中正在运行的 Python 程序

2.“凌晨 3 点多的时候可能出现”,表示问题并不是每天都出现的

3. 问题现象是程序卡死,重启后,有可以正常运行

线上服运行在真实环境,使用真实数据长时间运行,这种非必发性的错误通常难以在测试服或灰度服中发现,而且这种错误看日志通常难以判断出现这种问题的真正原因,可能其他地方的代码出现了问题,但没有被处理,导致异常状态一直堆积,一段时间后才出现的问题。

根据上面的关键信息,我开始进行如下思考:1. 思考是否可以构建「最小实例进行复现呢?」,可以复现就说明找到了问题。

2. 是代码的问题还是其他依赖服务存在问题导致本 Python 程序出现问题?

自己在测试环境运行相同的代码,发现没有任何问题,那是其他依赖的问题?这么多依赖服务,一个个查是不现实的,那只能在代码中加多点日志,然后再放到线上去看了?

其实还有使用更简单的方法去定位错误,那就使用 py-spy

使用 py-spy

py-spy 是一款开源的 Python 程序的抽样分析工具,使用 py-spy 可以很直观的查看 Python 程序的进程堆栈以及不同方法的耗时等,整个监控方式不需要对正在运行的程序做任何处理,即你不要修改程序代码也不需要重启程序。

py-spy 使用 Rust 语言开发,Rust 语言是一门号称 C/C++ 的运行速度、类 JavaScript 写法的语言,简单而言,就是开发效率高运行效率也高。py-spy 基于 Rust 语言提供的强大特性,使得它可以安全的用于生产环境中的 python 程序。

通过 pip 安装 py-spy

pip3 install -i https://pypi.doubanio.com/simple/ py-spy

安装完后就可以使用了,如果你是 windows 用户,需要下载预构建的二进制文件进行安装,细究可参考官方说明(在最后参考一节)。

通过 py-spy help 查看该工具支持的指令,总共就 3 种不同的指令,非常简单。

首先来使用 top 命令,它会生成类似 Unix 系统中 top 命令的效果,它有两种使用方式,分别如下。

# 如果python程序正在运行,直接通过pid进行采样

sudo py-spy top --pid 12345

# OR

# 如果python程序没有运行,可以使用如下命令

sudo py-spy top -- python myprogram.py

因为线上 Python 服务本身就是运行状态,所以直接通过 pid 去查看运行进程中的信息,这些信息会依据 py-spy 的采样实时更新。

从上图可以看出,top 命令会显示出当前 Python 进程中 GIL 锁的使用率、活跃线程率、线程数等总体信息,此外还会列出程序中不同方法的占用时间,其中的信息包含了使用的第三方库所占用的时间。

此外,还可以让 py-spy 生成火焰图(flame graph),通过火焰图可以更直观的判断出程序的性能情况。

py-spy 生成火焰图只需使用 record 命令则可,与 top 命令类似,同样有两种使用方式,如下。

py-spy record -o profile.svg --pid 12345

# OR

py-spy record -o profile.svg -- python myprogram.py

-o 参数用于指定火焰图生成的路径。

如果你不清楚怎么看火焰图,不用紧张,后面会介绍火焰图的使用方法。

如果你的程序突然卡死了,你又不清楚它为何会卡死,此时就可以通过 py-spy 的 dump 命令来查看当前程序的调用堆栈,通过调用堆栈来判断 Python 程序挂在何处。

dump 命令只能用于正在运行的 Python 程序。

py-spy dump --pid 12345

从图中可以很清晰的看出当前 Python 程序中所有活跃线程的调用栈。

加多 --locals 参数可以将每个堆栈帧关联的局部变量也打印出来,如下图。

py-spy 的简单用法就介绍完了。

读懂火焰图

火焰图通常是 svg 图片,可以直接通过 Chrome 浏览器打开。

py-spy 生成的火焰图其火焰是向下的,而有些工具生成的火焰图其火焰是向上,样式不同,但没有什么本质区别。

看到刚刚 py-spy 生成的火焰图。

火焰图的 y 轴表示程序的调用栈,每一层都是一个函数,调用栈越深,火焰就越高,最底部就是当前正在执行的函数,上方都是它的父函数。

火焰图 x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,表示它被抽样程序抽到的次数越多,也就表示该方法的执行时间较长。

需要注意,火焰图 x 轴不代表时间,而是所有调用栈合并后,按字母顺序排列而成。

此外,火焰图的颜色没有特殊含义。

火焰图是可以互动的。1. 鼠标悬浮

当鼠标悬浮在火焰的某一层,火焰图都会显示出当前层对应的完整函数名、抽样抽中的次数、占据总抽样次数的百分比。2. 可点击放大查看

可以点击火焰的某一层,火焰图会水平放大,该层会占满 x 轴,从而显示出该层的详细信息。3. 可以搜索

点击火焰图中的 Search 会显示一个搜索框,用户可以输入关键字或正则表达式,所有符合条件的函数名都会高亮显示。

其实 Chromme 浏览器本身就可以生成访问某网站时的性能火焰图。

打开开发者工具 -> 切换到「Performance」 -> 点击「录制」按钮开始记录数据,此时访问 http://github.com,等网页完全加载后,停止录制,此时,开发者工具就会显示出一个时间轴,而它的下方就是一个火焰图。通过这个火焰图可以详细的分析当前页面的性能。

与传统的火焰图不同,x 轴是时间轴,而不是抽样次数。

参考

python制作动图、怎么运行_漫画:如何分析运行中的 Python 程序?相关推荐

  1. 利用Python制作动图演示坐标变换理论

    利用Python制作动图演示坐标变换理论 永磁同步电机是一个非线性.强耦合的物理系统,因而不便直接进行控制.后有研究人员创造性的提出了坐标变换理论(后逐渐成为矢量控制的一个部分),让永磁同步电机得以转 ...

  2. python制作动图-用Python制作迷宫GIF

    原标题:用Python制作迷宫GIF 安装 可以通过PyPi安装 或者通过Git 为什么你需要这个库? 问:我是一个Python迷,并且对迷宫的生成和迷宫解决的办法非常感兴趣.我很羡慕别人能够做出生成 ...

  3. 利用Python制作动图

    目前还没找到做带透明图层的图的gif,只能做一个带背景的矩形图片的组合gif. 获取图片 图片像素大小不一致,动图会很难看,可以用通过[画图]软件将像素调整为一致: python读入转为动图,代码如下 ...

  4. python交互式环境是什么意思_如何在交互式环境中执行 Python 程序

    如何在交互式环境中执行 Python 程序 相信接触过 Python 的小伙伴们都知道运行 Python 脚本程序的方式有多种, 目前主要的方式有: 交互式环境运行命令行窗口运行开发工具上运行等, 其 ...

  5. python制作动图、怎么运行_用Python2.7运行下面这个代码,但是出现了问题,请问如何可以解决,使之生成图像?...

    Process finished with exit code -1073741795 (0xC000001D) 这是什么意思,如何可以解决这个问题. import numpy as np from ...

  6. python图像识别生成矢量图_使用python制作矢量图

    Get一个使用python制作矢量图的新技能: 前言: Matplotlib远比我们想象的强大,而这只是众多python强大的包中的一个,不愧是群英荟萃. 绘图后端我们一般是看不见的,matplotl ...

  7. 利用NCL和Shell制作动图

    利用NCL和Shell制作动图 两个步骤: 1. NCL画图 必须保存成PDF格式,且frame设置为翻页: begincam_file1 = addfile("./run/FHIST_LK ...

  8. python多张图片合并拼接,python制作sprite图、雪碧图

    python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...

  9. 动图如何在线制作?教你一键在线制作动图

    相信不少小伙伴都想要自己制作gif动图,由于很多小伙伴并不知道动态图片怎么制作,所以就会选择从网上寻找gif在线制作的方法.但是网上很多制作gif动图的工具使用起来比较麻烦的时候应该怎么办呢?这时候, ...

最新文章

  1. linux 极简统计分析工具 datamash 必看教程
  2. 自定义服务器控件 继承不到父类/基类的 SupportsEventValidation 特性.
  3. git中的删除命令操作
  4. 2d绘制 c# dx_C# DX 编程
  5. Qt C++属性类型提供给 QML调用(五)
  6. bzoj2753: [SCOI2012]滑雪与时间胶囊
  7. Spring MVC 中的 controller层的方法的返回值类型
  8. ux和ui_糟糕的UI与UX番茄酱模因
  9. Java并发编程--理解ThreadLocal
  10. 山西计算机网络技术专升本分数线_2020山西成考专升本招生补录第一批公告!附补录院校专业缺额表!...
  11. HTML文本下划线效果,css文本下划线怎么打?
  12. python数据存储系列教程——python对象与json字符串的相互转化,json文件的存储与读取
  13. pyton-虚拟环境以及django的初步使用记录信息
  14. 【最佳实践】如何搭建反向代理服务访问OSS资源?
  15. 华硕UX433FN安装Win黑苹果双系统
  16. 蓝桥杯真题 Python A组 路径
  17. 用excel制作双层饼图_Excel中怎么绘制双层饼图?
  18. 1KB文件夹快捷方式病毒解决方法
  19. 基于ssh的远程连接服务器
  20. linux创建用户和组

热门文章

  1. 2017全球光伏增速或放缓 国内“6·30”仍将是分水岭
  2. 机器学习技法总结(六)Decision Tree Hypothesis
  3. 【李宏毅2020 ML/DL】P97-98 More about Meta Learning
  4. 【汇编语言与计算机系统结构笔记11】程序格式与伪操作:段定义、堆栈 #简洁笔记形式
  5. 【vim入门笔记】基本操作与插件安装
  6. keytool 错误 java.io.IOException: incorrect AVA format
  7. 模块说和神经网络学说_让神经网络解释自己:牛津大学博士小姐姐,用毕业论文揭示“炼丹炉”结构...
  8. usr/sbin/inetd
  9. SQL Server 数据类型陷阱
  10. 根据IP定位用户所在城市信息