对于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