本文章转载于搜狗测试
在稳定性测试中发现问题后,用perf分析cpu占用的案例:
测知乎summary遇到一个问题,summary改清空缓存时间改短为15分钟(12小时->15分钟),发现一个情况:缓存清空变为频繁后,打summary压力超过5个小时左右,summary的cpu升高从120%左右升高到300%左右,响应时间随之翻倍。这个情况由于第一次打压力时硬盘满,怀疑是硬盘将打满出现的问题,清空硬盘留出较大空间之后可以复现,排除了硬盘问题,但仍原因不明。
现象:发压力一段时间之后cpu上升到300%,排除了词表问题,数据问题,机器其他进程的问题,IO问题。
对照组不进行频繁的缓存清空,问题不复现。
排查多个变量后,发现问题仍然存在,基本打4、5个小时就可以复现,遂希望直接分析cpu占用的差异所在,建议用perf进行cpu占用分析。perf可针对某个进程进行
cpu占用分析,大致步骤是:
(1)启动测试进程并压力运行
(2)在稳定状态下(怀疑有问题)执行perf record -p pid
(3)停止perf,输出报告,ctrl+c中止即可,默认perf.data文件
(4)手动备份一下,执行perf解析报告perf report -i perf.data或者其他的报告文件
我们把有/无问题的summary进行了对比,发现有问题的进程,第三方tcmalloc占用cpu明显增多。考虑到centos7机器上tcmalloc会导致lquery出core,我们决定先去掉summary的tcmalloc,打压力观察一下问题的原因。通过这个工具辅助,增强了我们对问题分析的能力,在这个场景下挺实用的。
这个工具在我们常用的RHEL6下也可以正常运作,我挑了个lquery:
从图上我们可以看到,通常情况下query的速度已经很快了,但是大部分时间仍然消耗在rank代码上
附注:
pref stat的项目解说,引用自IBM相关公开文档:
https://www.ibm.com/developerworks/c...ux/l-cn-perf1/
Task-clock-msecs:CPU利用率,该值高,说明程序的多数时间花费在CPU计算上而非IO。
Context-switches:进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的。
Cache-misses:程序运行过程中总体的cache利用情况,如果该值过高,说明程序的cache利用不好
CPU-migrations:表示进程t1运行过程中发生了多少次CPU迁移,即被调度器从一个CPU转移到另外一个CPU上运行。
Cycles:处理器时钟,一条机器指令可能需要多个cycles,
Instructions:机器指令数目。
IPC:是Instructions/Cycles的比值,该值越大越好,说明程序充分利用了处理器的特性。
Cache-references: cache命中的次数
Cache-misses: cache失效的次数。
网友评论