10年测试老鸟总结,性能测试-CPU性能瓶颈分析(超详细)

前言

1、cpu指标要求

建议CPU指标如下:
对于每一个CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6;

如果CPU在满负荷运行,应该符合下列分布:
User Time:65%~70%,us过大,说明有用户进程占用很多cpu时间,需要进一步的分析其它软硬件因素。

System Time:30%~35%,sy过大,说明系统管理方面花了很多时间,说明该系统中某个子系统产生了瓶颈,需要进一步分析其它软硬件因素。

User Time+System Time,合理值范围是 60-85%,如果在一个多用户系统中us+sy时间超过85%,则进程可能要花时间在运行队列中等待,响应时间和业务吞吐量会受损害

Idle:0%~5%,CPU完全空闲的百分比
对于上下文切换要结合CPU使用率来看,如果CPU使用满足上述分布,大量的上下文切换也是可以接受的。

出现cpu计数器不在范围时,不一定是由于cpu资源不够,因为其他资源的也会引起,例如内存不够时,cpu会忙内存管理的事,表面上可能是cpu的利用为100%

2、cpu3个重要概念

有3个重要的概念:上下文切换(context switchs),运行队列(Run queue)和使用率(utilization)

1)查看运行队列,使用top或者uptime查看:
每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是run able状态。

如果CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。

队列愈大,程序执行时间就愈长。

“load”用来表示运行队列,用top 命令我们可以看到CPU一分钟,5分钟和15分钟内的运行队列的大小。

这个值越大表明系统负荷越大。用uptime得到的3个负载值除以逻辑CPU数,如果3个结果值均>1,则表示CPU过载。

2)查看上下文切换,使用vmstat查看cs:
每个CPU(或多核CPU中每个核心)在同一时间只能执行一个线程,Linux采用抢占式调度,线程的处理器可以在同一时间运行多个线程(包括多核CPU),Linux内核会把多核的处理器当作多个单独的CPU来识别;

即为每个线程分配一定的执行时间,当到达执行时间,线程中有IO阻塞或高优先级线程要执行时,Linux将切换执行的线程,在切换时要存储目前线程的执行状态,并恢复要执行的线程状态,这个过程称之为上下文切换;

一个标准的Linux内核可以支持运行50~50000个进程运行,对于普通的CPU,内核会调度和执行这些进程。

3)关于时间片和动态优先级:
时间片对于CPU来说是很关键的参数,如果时间片太长,就会使系统的交互性能变差,用户感觉不到并行。如果太短,又会造成系统频繁的上下文切换,使性能下降。

对于IO Bound的系统来讲并不需要太长的时间片,因为系统主要是IO操作;而对于CPU Bound的系统来说需要长的时间片以保持cache的有效性。

每一个进程启动的时候系统都会给出一个默认的优先级,但在运行过程中,系统会根据进程的运行状况不断调整优先级,内核会升高或降低进程的优先级(每次增加或降低5),判断标准是根据进程处于sleep状态的时间。

IO Bound进程大部分时间在sleep状态,所以内核会调高它的优先级,CPU Bound进程会被内核惩罚降低优先级。

因此,如果一个系统上即运行IO Bound进程,又运行CPU Bound进程,会发现,IO Bound进程的性能不会下降,而CPU Bound进程性能会不断下降。

3、CPU相关分析命令

top命令:
输入top命令,如下图:

21

top命令显示内容后按1,则会显示每颗CPU的使用情况,如下图

22

结论:用户空间和内核空间的CPU使用百分比一般是70%和30%,这是一个比较合理的值。如果内核空间占用CPU太多,则会影响进程(用户空间)提供的服务。

uptime命令:

输入uptime命令,如下图:

23

结论:CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6

w命令:

24

结论:主要关注Load average,其3个值从左至右分别代表最近1分钟、最近5分钟、最近15分钟系统的负载。如果这3个值除以CPU核数>1,则表示服务器有较大压力,可以使用vmstat进一步查看CPU运行队列。

vmstat命令:

25

说明:
cs表示上下文切换的数量;
r: 表示系统中 CPU 等待处理的线程。由于 CPU 每次只能处理一个线程,所以,该数值越大,通常表示系统运行越慢,当这个值超过了CPU数目,就会出现CPU瓶颈了;

wa:IO 等待消耗的 CPU 时间百分比。该值较高时,说明 IO 等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。

mpstat命令:
如果要看某颗CPU的使用情况,则使用命令:mpstat -P 0 1或sar -P 0 1,其中0代表的是第0颗CPU,1表示每隔1秒统计一次,效果如下图:

26

sar命令(System Activity Reporter系统活动情况报告):
执行sar -q命令,结果如下:

27

说明:
runq-sz:运行队列的长度(等待运行的进程数);
plist-sz:进程列表中进程(processes)和线程(threads)的数量;
ldavg-1:最后1分钟的系统平均负载(System load average);
ldavg-5:过去5分钟的系统平均负载;
ldavg-15:过去15分钟的系统平均负载;

pidstat命令:
自动某个进行上下文切换情况:

28

结论:关注nvcswch/s,如果数量较大,则表示进程被强制切换,亦或抢不到CPU资源
查看活动进程的 CPU 统计信息:

29

dstat命令:
执行dstat --top-cpu 可以实时查看CPU当前在运行的进程名称,如下图

dstat --top-cpu --top-mem --top-io
  • 1

30

4、定位进程某个线程cpu高

top -Hp pid来找到 CPU 使用率比较高的一些线程
将排在前面的线程 PID 转换成十六进制:printf ‘%x\n’ pid得到 nid
打印 Java 线程栈的信息:jstack 24076| grep 5e0d -A30

5、结论

检查system的运行队列,以及确定不要超出每个处理器3个可运行状态线程的限制.
确定CPU 利用率中user/system比例维持在70/30
当CPU 开销更多的时间在system mode,那就说明已经超负荷并且应该尝试重新调度优先级
当I/O 处理得到增长,CPU 范畴的应用处理将受到影响

PS:对于JAVA应用,CPU瓶颈可以通过jprofiler监控分析

 最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值