随着工作的积累,在性能测试过程中,主要遇到问题主要有以下 3 类:
1、cpu 问题;
2、sql 问题;
3、参数问题

今天就和大家讲讲如何进行 cpu 问题定位的常用方法和步骤。

更多工作中的测试技能干货,大家可以关注微信公众号<大话性能>,会持续不断分享。

http://dwz.cn/NNW9Wm5G

现象描述

1、多核 CPU 使用率不均衡,有些 CPU 使用率较高,有些 CPU 基本没有使用。
大多数情况下,服务不会均衡的分配到每个服务器。

2、cpu 使用率很高。

排查步骤

 步骤 1 top 查看系统资源占用情况
哪些 CPU 核使用较高 "qatest@app-50:~$ top
 
Tasks: 144total,   2running, 142sleeping,   0stopped,   0zombie
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  70%us,  1.0%sy,  0.0%ni, 28%id,  1.3%wa,  2.6%hi,  0.0%si,  0.0%st
Cpu2  :  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
 
然后按 1 键,查看每个 CPU 核负载。从以上数据不难看出,CPU1 偏高,其它 CPU 比较空闲。
那 CPU1 在做什么呢?"
查看是什么进程负载比较高 "top 查看什么进程 CPU 使用较高:
 
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+ COMMAND                                                                          
24734java 20   0  929m 598m 5648S   807.5  81:34.63java
 
可以初步判断是 java 进程负载比较高。
那这个 java 进程究竟在忙什么呢?"
步骤 2 查找耗费资源线程
查看每个 CPU 核上有哪些线程 "ps -eLo pid,tid,pcpu,psr,comm | grep XXX
pid 进程号
tid 线程号
pcpu cpu 利用率
psr 所在 cpu 核号
comm 进程名
 
分析负载较高的核上有哪些线程,那这些线程在做什么?"
或者 top -H 查找线程 "或者使用 top -H 查找 cpu 使用率较高的线程。
 
PID   USER   PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5783  qatest 200127m 27m 2444S 120.10:00.44/home/qatest/tobie2
24117qatest 200129m 32m 2532S 100.10:05.06/home/qatest/tobie2
632   qatest 200127m 29m 2556S 100.10:01.96/home/qatest/tobie2
3354  qatest 200118m 22m 2456S 100.10:00.86/home/qatest/tobie2
"
步骤 3 jstack 分析线程在做什么
分析热点线程堆栈 "jstack -l  dump 线程堆栈
将 grep 出的线程号,转换成十六进制,在线程堆栈中查找相应十六进制的线程号和堆栈信息。
分析线程堆栈信息,查看 CPU 可能消耗的点。
根据经验,可能的原因有:死循环、死锁、过多使用锁等。"

以上就是 cpu 问题最基础也是最原始的定位方法,另外 jvm 的垃圾回收也有可能导致 cpu 的问题,也需要留意和关注。
如果公司有钱或不差钱,会有一些商用的工具,譬如 apm、Dynatrace 等性能应用管理工具。

大家可持续关注大话性能公众号,不断学习测试实战技能和高薪岗位内推。


↙↙↙阅读原文可查看相关链接,并与作者交流