python制作动图、怎么运行_漫画:如何分析运行中的 Python 程序?
漫画:如何分析运行中的 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 程序?相关推荐
- 利用Python制作动图演示坐标变换理论
利用Python制作动图演示坐标变换理论 永磁同步电机是一个非线性.强耦合的物理系统,因而不便直接进行控制.后有研究人员创造性的提出了坐标变换理论(后逐渐成为矢量控制的一个部分),让永磁同步电机得以转 ...
- python制作动图-用Python制作迷宫GIF
原标题:用Python制作迷宫GIF 安装 可以通过PyPi安装 或者通过Git 为什么你需要这个库? 问:我是一个Python迷,并且对迷宫的生成和迷宫解决的办法非常感兴趣.我很羡慕别人能够做出生成 ...
- 利用Python制作动图
目前还没找到做带透明图层的图的gif,只能做一个带背景的矩形图片的组合gif. 获取图片 图片像素大小不一致,动图会很难看,可以用通过[画图]软件将像素调整为一致: python读入转为动图,代码如下 ...
- python交互式环境是什么意思_如何在交互式环境中执行 Python 程序
如何在交互式环境中执行 Python 程序 相信接触过 Python 的小伙伴们都知道运行 Python 脚本程序的方式有多种, 目前主要的方式有: 交互式环境运行命令行窗口运行开发工具上运行等, 其 ...
- python制作动图、怎么运行_用Python2.7运行下面这个代码,但是出现了问题,请问如何可以解决,使之生成图像?...
Process finished with exit code -1073741795 (0xC000001D) 这是什么意思,如何可以解决这个问题. import numpy as np from ...
- python图像识别生成矢量图_使用python制作矢量图
Get一个使用python制作矢量图的新技能: 前言: Matplotlib远比我们想象的强大,而这只是众多python强大的包中的一个,不愧是群英荟萃. 绘图后端我们一般是看不见的,matplotl ...
- 利用NCL和Shell制作动图
利用NCL和Shell制作动图 两个步骤: 1. NCL画图 必须保存成PDF格式,且frame设置为翻页: begincam_file1 = addfile("./run/FHIST_LK ...
- python多张图片合并拼接,python制作sprite图、雪碧图
python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...
- 动图如何在线制作?教你一键在线制作动图
相信不少小伙伴都想要自己制作gif动图,由于很多小伙伴并不知道动态图片怎么制作,所以就会选择从网上寻找gif在线制作的方法.但是网上很多制作gif动图的工具使用起来比较麻烦的时候应该怎么办呢?这时候, ...
最新文章
- linux 极简统计分析工具 datamash 必看教程
- 自定义服务器控件 继承不到父类/基类的 SupportsEventValidation 特性.
- git中的删除命令操作
- 2d绘制 c# dx_C# DX 编程
- Qt C++属性类型提供给 QML调用(五)
- bzoj2753: [SCOI2012]滑雪与时间胶囊
- Spring MVC 中的 controller层的方法的返回值类型
- ux和ui_糟糕的UI与UX番茄酱模因
- Java并发编程--理解ThreadLocal
- 山西计算机网络技术专升本分数线_2020山西成考专升本招生补录第一批公告!附补录院校专业缺额表!...
- HTML文本下划线效果,css文本下划线怎么打?
- python数据存储系列教程——python对象与json字符串的相互转化,json文件的存储与读取
- pyton-虚拟环境以及django的初步使用记录信息
- 【最佳实践】如何搭建反向代理服务访问OSS资源?
- 华硕UX433FN安装Win黑苹果双系统
- 蓝桥杯真题 Python A组 路径
- 用excel制作双层饼图_Excel中怎么绘制双层饼图?
- 1KB文件夹快捷方式病毒解决方法
- 基于ssh的远程连接服务器
- linux创建用户和组
热门文章
- 2017全球光伏增速或放缓 国内“6·30”仍将是分水岭
- 机器学习技法总结(六)Decision Tree Hypothesis
- 【李宏毅2020 ML/DL】P97-98 More about Meta Learning
- 【汇编语言与计算机系统结构笔记11】程序格式与伪操作:段定义、堆栈 #简洁笔记形式
- 【vim入门笔记】基本操作与插件安装
- keytool 错误 java.io.IOException: incorrect AVA format
- 模块说和神经网络学说_让神经网络解释自己:牛津大学博士小姐姐,用毕业论文揭示“炼丹炉”结构...
- usr/sbin/inetd
- SQL Server 数据类型陷阱
- 根据IP定位用户所在城市信息