It's our wits that make us men.

python性能测试及优化

Posted on By 刘电波

introduction

在一次版本的迭代后,第二天发现cpu的占用率大量飙升,最开始以为是版本迭代时的错误代码导致,后来经过排查,发现是用户量的提升,导致以前没有暴露出来的问题突然暴露出来,随后用python那一套优化工具进行检测优化,并且成功把cpu占用率重新拉低到10%。

1. 测试python执行效率的工具

这里有各种工具的介绍

http://python.jobbole.com/80754/#article-comment

(1)cprofile的使用

根据监控项目出现的问题,分析后决定使用cprofile去检测。主要是可以检测函数消耗,而且使用方便,可以对代码无侵占式的进行检测。

使用以下代码执行py脚本

 
python -m cProfile -o /home/ubuntu/cprofile.log test.py -s

-m 使用cprofile模块

-o 输出位置

-s 累加

刚执行的时候,输出文件时不存在的,只有结束之后才会在目标位置出现输出文件。

(2)安装将文件传输到你本地的机器

由于该测试是在linux服务器上运行,我们需要把结果文件传到本地,用图形化的分析工具区分析,当然也可以直接用工具在shell打印分析,但是很不友好。

这里我们是用scp这个工具去拉取,由于scp默认是22端口,但是linux服务器是通过秘钥登陆,并且端口是9528,所以我们应该这么使用这个命令,重远程服务器拉取

 
scp -P 9528 liudianbo@remote_addr:/dir/cprofile.log /home/bo/test

-P 端口

remote_addr 远程地址ip或者域名

/dir/ 远程文件位置

/home/bo/test 本机目录

2. 图形化分析工具snakeviz

使用snakeviz来分析刚才我们得到的cprofile.log

(1)安装

pip install snakeviz

(2)使用

 
sudo snakeviz /home/bo/testcprofile.log 

(3)分析

如上图所示,刚开始时一个十分亮丽的圆形,这里我们切换到另外一种形态去分析。

这样十分直观,这里我们一看就知道zmqdeepcopy的消耗十分大,因为项目用deepcopy毫无节制(当初是为了安全),这里为了效率只能”危险“一点,直接使用引用这样少了很多消耗。优化后从高峰100%的CPU使用率降低到20-30%左右, 可以说是非常明显的优化了。如下图所示,

美中不足的是,cprofile运行时间太少,可以运行几个钟再来看,分析效果会更好。