调用分析
py-spy
火焰图生成, top, dump性能,主要针对线程调用链路进行分析
https://github.com/benfred/py-spy
- 火焰图
- py-spy record -o profile.svg --pid 12345
- py-spy record -o profile.svg -- python myprogram.py
- top
- py-spy top --pid 12345
- py-spy top -- python myprogram.py
- dump
- py-spy dump --pid 12345
gdb
适用于线程调用追踪和代码运行点位分析,可以进行断点。
需要有对应版本的libpython
curl -o- http://file.fudata.work/base/python/Python-3.7.7.tgz| tar zxvf -source Python-3.7.7/Tools/gdb/libpython.py
cProfile
分析各个部分执行的频率和时间
https://docs.python.org/zh-cn/3/library/profile.html
werkzeug相关web应用可以直接使用中间件生成每个请求的分析文件, 结合snakeviz绘图
mkdir profiles # ProfilerMiddleware适用于对整体的请求进行拦截 from werkzeug.middleware.profiler import ProfilerMiddleware app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir="profiles")
snakeviz
基于cProfile的dump文件,进行可视化分析
pyinstrument
调用栈分析
https://github.com/joerick/pyinstrument
line_profiler
逐行调用分析
https://github.com/pyutils/line_profiler
内存分析
Memray
功能非常完备了,支持live和离线bin分析模式。但是都需要让应用挂在memray进行下运行, 。如果有c等原生调用(比如我们目前的tensorflow),需要加上--native
https://github.com/bloomberg/memray
#memray run -o tfe_`date +'%s'`.bin --native -f -m fmpcbase.player --config /data/fmb-server/conf/project.cfg > /data/logs/tfe_server.log
高级用法
pyrasite + guppy3
pyrasite可以往运行中的python进程注入代码,结合guppy3可以对运行中的内存或其他信息进行分析。可操作性更大,但是需要自己编写pyload,门槛和成本较高
https://github.com/lmacken/pyrasite
https://github.com/zhuyifei1999/guppy3
分析建议
进程卡死无响应
- 用py-spy dump出线程和火焰图
响应速度慢
- 使用cprofile + snakeviz生成耗时和调用
- web服务可以使用werkzeug的ProfilerMiddleware生成每个请求的分析文件,结合snakeviz绘图分析
- 更细节的分析可以用pyinstrument+line_profiler
内存泄漏或者高占用
- 使用memray dump内存占用提交开发
疑难杂症分析
- gdb进行断点分析
- Pyrasite + Payload进行热分析