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命令,如下图:
top命令显示内容后按1,则会显示每颗CPU的使用情况,如下图
结论:用户空间和内核空间的CPU使用百分比一般是70%和30%,这是一个比较合理的值。如果内核空间占用CPU太多,则会影响进程(用户空间)提供的服务。
uptime命令:
输入uptime命令,如下图:
结论:CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6
w命令:
结论:主要关注Load average,其3个值从左至右分别代表最近1分钟、最近5分钟、最近15分钟系统的负载。如果这3个值除以CPU核数>1,则表示服务器有较大压力,可以使用vmstat进一步查看CPU运行队列。
vmstat命令:
说明:
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秒统计一次,效果如下图:
sar命令(System Activity Reporter系统活动情况报告):
执行sar -q命令,结果如下:
说明:
runq-sz:运行队列的长度(等待运行的进程数);
plist-sz:进程列表中进程(processes)和线程(threads)的数量;
ldavg-1:最后1分钟的系统平均负载(System load average);
ldavg-5:过去5分钟的系统平均负载;
ldavg-15:过去15分钟的系统平均负载;
pidstat命令:
自动某个进行上下文切换情况:
结论:关注nvcswch/s,如果数量较大,则表示进程被强制切换,亦或抢不到CPU资源
查看活动进程的 CPU 统计信息:
dstat命令:
执行dstat --top-cpu 可以实时查看CPU当前在运行的进程名称,如下图
dstat --top-cpu --top-mem --top-io
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监控分析
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
只有坚持不懈的努力,才能让梦想破茧成蝶,在逆境中绽放光芒。相信自己的能量,拥抱挑战,无论多么艰辛,都要勇往直前,不停追求进步,成就非凡人生。
只有拼尽全力,才能品味到成功的甘甜;只有坚守不懈,才能迎来人生的辉煌。无论困难多大,只要心怀信念,相信自己,你一定能创造奇迹!加油!
即使前路坎坷,也要坚定不移地追逐梦想,只有付出才能换来收获。奋斗者无畏困难,勇往直前,终将在征途中找到属于自己的辉煌。