[python][profiling]python的性能监控的几种方法

前言: 编译型语言,比如C,C++,Go编译出来的二进制,可以使用perf来分析性能。对于编译出来的elf格式,使用dwarf来分析symbol。 对于python这种解释型语言,就会比较麻烦。因为python进程的stack是Cpython的stack,并非对应的py的stack。 分析: 1,cProfile python的官方提供了profiling工具,https://docs.python.org/2/library/profile.html 用法上,需要修改代码,重新执行。对于线上业务,其实是不太友好的。另外就是如果父进程启动之后,启动子进程执行,就没法工作了。 相比这种方式,作者更倾向旁路的方式,对于一个running的python进程进行profiling,业务进程不需要修改,也无感知(允许一定范围内的性能下降)。像perf一样,不侵入进程的情况下进行性能分析,用起来更舒服一些。 2,cpython的stack 来一段测试代码:

打印的结果是:

python的内置的traceback的结果,也是我们预期的。 实际上,使用gdb得到的结果:

可见,python进程的stack,是解释器的二进制的stack。 3,py-bt python提供了gdb的能力,但是对gdb的版本有些要求。搭起来环境,发现gdb可以dump出来python的backtrace。 順藤摸瓜,分析libpython.py的代码发现: a,使用gdb来dump出来cpython的stack b,过滤掉非python的stack,方法就是判断frame的名字是不是“PyEval_EvalFrameEx”

c,在python的frame中保存了line number和file name。解释出来frame即可。 可见,gdb提供了一个很好的例子,使用旁路的方法,可以获取到python的backtrace。 那么,我们可以使用另外一个进程,每秒抓取1000次backtrace,哪个backtrace命中的更多,就说明CPU更加密集。好吧,这个动作的准确名词是“采样”,当然采样的频率可以调整才是。 4,pstack pstack和gdb的原理类似,都是使用kernel提供的ptrace这个syscall实现的。 相比于gdb,pstack更加合适。实际上,目前upstream上已经开始支持了python的trace。 改造pstack是一个不错的方法。 5,pyflame uber开源了pyflame工具,https://github.com/uber/pyflame 也是完全的旁路profiling工具。目前支持的功能基本满足需求,可以分析出来各个backtrace的命中次数,结合flame graph画出热点图。 值得一说的是,pyflame的实现上,和gdb的方式有很大差别: a,在cpython中,_PyThreadState_Current这个symbol保存着当前正在运行的thread。 b,在_PyThreadState_Current中保存着当前python栈的frame。 c,从当前的frame信息中得到行号和文件名,以及上一级frame的指针。 d,遍历frame得到所有的backtrace。 综上,pyflame是一个不错的旁路profiling工具。

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2018-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ksher

Kubernetes服务网格(第10部分):服务网格API

翻译人:Ksher,该成员来自云+社区翻译社

20910
来自专栏Java架构沉思录

深入浅出Unix IO模型

前言 在介绍Unix IO模型之前,我们先来说说什么是IO。根据维基百科的定义,IO 指的是输入输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入...

4537
来自专栏Java架构沉思录

深入浅出Unix IO模型

在介绍Unix IO模型之前,我们先来说说什么是IO。根据维基百科的定义,IO的指的是输入输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出...

1132
来自专栏linux驱动个人学习

IP地址的分类——a,b,c 类是如何划分的【转】

IP地址,一共分成了5类,范围分别如下: A类IP:从0.0.0.0 – 127.255.255.255,共有16777216个IP B类IP:从128.0...

1384
来自专栏数据和云

【视频】In Memory的内部结构和实现机制

小编寄语 罗马不是一日建成的。新特性5分钟系列视频,带你循序渐进学习Oracle12.2的最新特性,相约成长的路上,不见不散! { 本期话题 } In ...

3336
来自专栏贾老师の博客

谈谈分布一致性协议

1813
来自专栏杨海春的专栏

常用机器性能评估工具

软件系统跑在机器上,处理能力受硬件制约,所以,单机处理能力会有上限。评估机器处理能力的上限,检查程序的瓶颈在哪,有助于程序性能分析。主要的几大硬件:CPU、内存...

6540
来自专栏数据和云

ASM的备份解析与恢复

编辑说明:《Oracle性能优化与诊断案例精选》出版以来,收到很多读者的来信和评论,我们会通过连载的形式将书中内容公布出来,希望书中内容能够帮助到更多的读者朋友...

3356
来自专栏数据和云

深入内核:从Oracle ASM自动备份头块到ASMFD

张乐奕 云和恩墨副总经理 Oracle ACE 总监 ITPUB Oracle数据库管理版版主、Oracle高可用版版主、ACOUG联合创始人 在 Oracle...

3288
来自专栏Java后端技术

你误解了Windows的文件后缀名吗?

  有很多的小伙伴对windows下的文件后缀名不能很好地理解作用和区别,更不用说高深的使用了,在这里给大家说一下这些文件后缀名到底有什么区别,有什么作用呢?

981

扫码关注云+社区

领取腾讯云代金券