python性能分析工具之pyflame

这篇文章python性能优化总结的比较好,可以先看这篇的介绍。

里面介绍了针对不同场景使用的工具,

对于python程序,比较出名的profile工具有三个:profile、cprofile和hotshot。
其中profile是纯python语言实现的,Cprofile将profile的部分实现native化,hotshot也是C语言实现,hotshot与Cprofile的区别在于:hotshot对目标代码的运行影响较小,代价是更多的后处理时间,而且hotshot已经停止维护了。需要注意的是,profile(Cprofile hotshot)只适合单线程的python程序。
对于多线程,可以使用yappi,yappi不仅支持多线程,还可以精确到CPU时间
对于协程(greenlet),可以使用greenletprofiler,基于yappi修改,用greenlet context hook住thread context。

profile的结果可以用gprof2dot生成函数调用开销图,进行分析。

这里介绍另外一个好用的工具pyflame。对单线程,多线程,协程支持都很好,使用简单,不用修改源码,直接profile运行的进程。效率较高,进程运行只会慢3倍左右,建议非线上环境使用。最最关键的是可以直接生成火焰图,具体介绍可以看github链接pyflame
火焰图怎么看先google学习下,比gprof2dot的图更清晰明了。


pyflame的安装步骤在github上介绍的很详细,对centos7也是适用的。这里介绍下内核较老的centos6+python2.6下面的安装(是一个C API 缺失setns)。

  1. 下载源码,git clone https://github.com/faicker/pyflame
  2. 安装编译环境(高版本gcc和autoconf)及依赖包,

    1
    2
    3
    4
    5
    yum install centos-release-scl
    yum install devtoolset-3-gcc devtoolset-3-gcc-c++
    rpm -ivh https://www.softwarecollections.org/en/scls/praiskup/autotools/epel-6-x86_64/download/praiskup-autotools-epel-6-x86_64.noarch.rpm
    yum install autotools-latest
    yum install python-devel
  3. 编辑文件/usr/lib64/pkgconfig/python2.pc

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    prefix=/usr
    exec_prefix=/usr
    libdir=/usr/lib64
    includedir=/usr/include
    Name: Python
    Description: Python library
    Requires:
    Version: 2.6
    Libs.private: -lpthread -ldl -lutil
    Libs: -L${libdir} -lpython2.6
    Cflags: -I${includedir}/python2.6
  4. 编译,

    1
    2
    3
    4
    5
    scl enable devtoolset-3 bash
    scl enable autotools-latest bash
    ./autogen.sh
    ./configure
    make
  5. pyflame -s 10 12345 | flamegraph.pl > myprofile.svg

Enjoy.

注意点:

  • profile eventlet程序时,要把pyflame结果里出现次数最多(比采样次数还多)的tpool.py:tworker:75的堆栈删掉。
  • svg文件可以用浏览器比如chrome打开。
  • 官方版本已经把centos6的支持合进去了(centos 6可以用1.5.2,后面的版本有点问题)