对于cpu,目前比较关心的是cpu的利用率还有cpu的load,或者还有cpu运行队列。
cpu利用率
cpu利用率分为sys,us。分别为操作系统和用户进程所占用的cpu利用率。sys的占用,一般是进行内核操作,比如线程的调度,网络请求等操作。cpu利用率是指一段时间内,对cpu占用的时间比。比如30% ,如果是已1m为单位统计的,就是说1m内有60*0.3s的cpu占用。
通常来说,cpu利用率是越高越好,因为这意味着cpu资源可以充分被利用,计算任务可以快速被计算完成。当然这不是绝对的,也有可能是程序有问题,在空吃cpu,所以还是需要具体分析cpu到底在执行什么任务。放在线上服务的场景下,也并不意味着我们要把cpu的利用率达到很高,因为这意味着空闲cpu资源很少,如果线上有大的请求波动的话,会造成故障。
cpu的空闲可能有三个原因造成:
1. 线程在等待外部资源,比如网络返回。
2.线程被阻塞,比如在等锁的释放等。
3.线程真的很闲
查看cpu利用率方法:top , vmstat 1, top -p pid -H (可以查看一个进程下的线程的cpu占用)
cpu Load
cpuLoad是指一段时间内,cpu正在处理和等待处理的任务的总和(我认为至少不是进程维度的)。
一般来说,cpu的load不宜过大,最大不应该操作系统的内核数(逻辑cpu数, 逻辑cpu数=物理CPU个数 * 每个物理CPU的核心数 * 超线程数量)。因为load超过这个数的话,一般会导致cpu过于繁忙,可能会引起调度比较繁忙,造成性能下降。
查看load方法:top
查看cpu核数方法:
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
#查看每个物理CPU中的核心数
cat /proc/cpuinfo| grep "cpu cores"| uniq
#查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
cpu运行队列
是指排队等待被调度的线程队列。不太清楚这个和load的区别,可能是一个东西。有关特性,可以看cpu load部分
查看方法:vmstat 1
cpuLoad和cpu利用率的关系
一般来说,cpuload高也会导致cpu的利用率高,但也有很大的例外。
CPU负载高利用率低:说明等待执行的任务很多,但是通常任务多CPU使用率也会比较高,如果低就说明CPU根本没工作,那些很多的任务处于等待状态,比如虽然有很多任务在等待执行,但是他们获得cpu的调度,在执行的时候,并没有进行什么实际的操作,比如直接把自己挂起或者直接进行io操作等。但是一般在这种情况下,load也应该是比较低的,所以需要查看下是否是进程僵死(这个我不理解是什么意思,但是还是记录一下,看以后会不会明白。可以通过命令ps –axjf查看是否存在D状态的进程,该状态时不可中断的睡眠状态。)或者程序有什么问题,比如在不停的创建新的线程来执行任务。
CPU利用率高负载低:说明任务少,但是任务执行时间长,有可能是程序本身有问题,如果没有问题那么计算完成后则利用率会下降。
提高/降低cpu利用率
在多线程的场景下,通常我们会使用固定大小的线程池来对任务进行处理。如果出现cpu利用率低的情况,很有可能的情况是,线程在大多数的时间都被阻塞了,比如锁等待或者io等待。在这种情况下,可以增加线程的数量,来提高cpu资源的利用率,当然也要考虑网卡的使用是否有瓶颈。当然,并不是说每次遇到这种情况,都应该直接增大线程数,造成cpu空闲的原因还有锁等待等因素,这种情况下增加线程也不会有理想的效果,应该首先分析如何消除同步的影响。
所以,线程池的设定,也可以通过考量在全负荷运转时,系统的load(cpu任务队列)还有cpu利用率来对线程池的线程数进行适当的调整。
比如,如果线程执行的任务本身对cpu的消耗比较高,大多都是cpu计算型的长任务,而且我们对线程池的线程数设的比较高,操作系统的表现就会是load很高,超过了cpu核数,而且cpu的利用率很高。这在线上的服务器是比较危险的,这时,在确认我们的程序没有问题的前提下,可以根据单个线程的cpu利用率来对线程数进行降低。如果因为程序本身的问题,导致了吃cpu,需要先解决程序中的问题。
其他
vmstat还可以看到上下文切换的次数,中断的次数,也是非常有用的指标,如下图中的cs表示每秒的context switch 数。in表示每秒的中断数,包括clock数。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 124668 158788 246668 3298720 0 1 7 21 0 0 3 1 96 0 0
0 0 124668 158540 246668 3298832 0 0 0 29 3065 4529 3 1 96 0 0
0 0 124668 157648 246668 3299012 0 0 0 65 3306 4868 2 1 97 0 0