如何理解和分析linux系统的CPU平均负载情况(load average)

最近研究linux时接触到了一个新的概念,叫做CPU的平均负载(load average)。之前都只听说过CPU的使用情况,很少听说过负载情况。于是对这个概念进行了一下研究学习,总结如下,以便日后查阅。

一、如何理解CPU负载情况

CPU负载情况定义为在特定时间间隔内运行队列中的进程数量的平均值,换句话说就是该段时间内正在使用和等待使用CPU的平均任务数。CPU的负载越大,代表CPU必须要在不同的工作之间进行频繁的工作切换。

请注意:它与CPU使用情况(CPU使用率)不是同一个概念。CPU使用率指的是CPU运行所有程序的耗时占所有时间的比例,它反映的是当前CPU的繁忙程度。举个简单例子,在单处理器中,线程1先工作10ms,线程2再工作30ms,之后CPU空闲60ms。则此100ms时间段内,CPU的利用率就是40%。如果CPU使用率持续居高,那么就需要考虑CPU是否已经处于超负荷运作,长期超负荷运作对于机器本身来说是一种损害,因此必须将CPU的利用率控制在一定的比例下,以保证机器的正常运作。

但是,反过来说,CPU使用率高,并不意味着CPU负载情况就一定大。举例来说:如果我有一个程序需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,但是CPU的负载情况则是趋近于“1”,因为CPU仅负责一个工作嘛!此时的CPU虽然很忙,但是不会卡,你想要再增加一个程序(比如新开一个浏览器窗口)的话,应该问题不大,系统立即就可以响应你的操作。而如果同时执行两个这样的程序呢?CPU的使用率还是100%,但是负载情况则变成2了。再进一步的,如果同时执行10个这样的程序,CPU的使用率依然是100%,可是负载情况变成了10,此时你想要再增加一个程序(比如新开一个浏览器窗口),则系统会变得非常卡,甚至死机!

以上分析可以看出,一台机器很有可能处于低使用率、高负载情况的情况,因此看机器的繁忙程度应该结合两者,从实际的使用情况观察。

可能上面的解释不是很直观,没怎么听懂。下面利用一个网上通用的比喻来形容一下【原文参见Understanding Linux CPU Load】,我添加了一些我自己的理解,让文字看起来更形象一些,不知道有没有形容不当的地方,若有发现还请不吝指正。

首先,假设最简单的情况,你的电脑只有一个CPU,所有的运算都必须由这个CPU来完成。以下所有的分析都是基于这个前提的,请注意!

然后,我们把这个CPU想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过(很显然,这座桥只能单向通行)。

  • 系统负荷为0,意味着大桥上一辆车也没有。一辆新来的车辆想要驶入,分分钟就进来了,完全没有问题(类比成你对电脑的操作,就好比你此时要新开一个音乐播放器,一点击图标,播放器立即就启动了,完全无需等待,响应速度极快,很爽);
  • 系统负荷为0.5,意味着大桥一半的路段有车。新来的车辆想要驶入,依然无需等待,瞬间进入(类比成新开音乐播放器的操作就是,一点击图标,播放器很快就启动了,时延几乎可以忽略);
  • 系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。同样驶来了一辆新的车辆,此时它没法瞬间驶入,而是必须在整个车流队伍的末端进行排队等候,但是好在车流很顺畅,队伍排一会就轮到它了(类比成新开音乐播放器的操作就是,点击图标之后,过了一小会播放器才启动,让你稍稍的等待了一小会,但是还在你可以接受的范围之内);
  • 系统负荷为1.7,意味着车辆太多了,大桥已经被占满了,后面等着上桥的车辆为桥面车辆的70%。同样还是那辆新的车辆要驶入,此时它要排队的时间就明显边长了,而且很可能存在堵车的风险(类比成新开音乐播放器的操作就是,点击图标之后,过了好一会,播放器才开始启动,而且启动之后还很卡,半天才响应过来,让你觉得有点郁闷+不爽了);
  • 以此类推,系统负荷2.0时,意味着等待上桥的车辆与桥面的车辆一样多,新来的车辆想要驶入的等候时间进一步变长;系统负荷3.0时,意味着等待上桥的车辆是桥面车辆的2倍。总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久,直到最后可能就导致车流完全卡死,新来的车辆根本无法驶入了(类比成新开音乐播放器的操作就是,点击图标之后,过了很久很久,播放器完全没有反应。你感觉似乎等了好几分钟了,实在是不耐烦了,于是再多点几下,结果桌面反而卡死了,又隔了半天,系统居然弹了一个“播放器没有响应,是否要结束任务?”的对话框出来,你毫不犹豫点击结束任务,又是半天没有动静,似乎过了一个世纪之后,电脑完全卡死了,鼠标和键盘都不能用了,天地间只剩一个你在崩溃中重启你的电脑…)。

CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工作量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。

如果CPU每分钟最多处理100个进程,那么系统负荷0.2意味着CPU在这1分钟里只处理20个进程;系统负荷1.0意味着CPU在这1分钟里正好处理100个进程;系统负荷1.7意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。

从理论上来说,为了电脑顺畅运行,系统负荷最好不要超过1.0,这样就没有进程需要等待了,所有进程都能第一时间得到处理。很显然,1.0是一个关键值,超过这个值,系统就不在最佳状态了,你要动手干预了。

当然,上面所有的案例中,我们假设你的电脑都只有1个CPU。如果你的电脑装了2个CPU(或者是装了一个双核的CPU),会发生什么情况呢?

2个CPU(或者双核CPU),意味着电脑的处理能力翻了一倍,能够同时处理的进程数量也翻了一倍。还是用大桥来类比,两个CPU就意味着大桥有两根车道了,通车能力翻倍了。所以,2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU核心的电脑,可接受的系统负荷最大为n.0。

二、如何查看CPU负载情况

首先要看下系统的CPU核心总数,这是前提,单核CPU与多核CPU的负载情况标准是完全不一样的。使用以下命令查看CPU核心数:

leon@Ubuntu:~$ grep -c 'model name' /proc/cpuinfo
6

然后就可以查看CPU的负载情况了。直接使用uptime命令就可以看到了:

leon@Ubuntu:~$ uptime
 20:21:34 up 11:30,  1 user,  load average: 0.00, 0.00, 0.00

load average后面跟的就是CPU的负载值了,这是三个平均值,分别代表的是系统在最近1分钟、5分钟、15分钟内,CPU的平均负载情况(也可以说是平均进程数)。

另外,也可以通过/proc/loadavg文件来查看:

leon@Ubuntu:~$ cat /proc/loadavg 
0.98 0.75 0.57 2/422 2879

前三个数字大家都知道,是1、5、15分钟内的负载情况。后面两个呢,第一个(2/422)的分子2是正在运行的进程数,分母422是进程总数;后一个2879是最近运行的进程ID号。

当然,还可以使用下面更专业的top命令进行更加详细的分析:

leon@Ubuntu:~$ top

top - 20:47:24 up 11:56,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 198 total,   1 running, 144 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.2 us,  0.1 sy,  0.0 ni, 98.2 id,  1.5 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3072672 total,  2074460 free,   553804 used,   444408 buff/cache
KiB Swap:   998396 total,   839408 free,   158988 used.  2317720 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
  906 root      20   0  585180 100336  18024 S   1.3  3.3   3:12.98 Xorg        
 2404 leon      20   0 1369504  85028  41244 S   1.0  2.8   4:24.27 compiz      
 2620 leon      20   0  617872  31252  20524 S   0.7  1.0   0:08.99 gnome-term+ 
 2122 leon      20   0  403148   1192    816 S   0.3  0.0   0:00.83 indicator-+ 
    1 root      20   0  185220   3916   2464 S   0.0  0.1   0:02.59 systemd     
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd    
    4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:+ 
    6 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_+ 
    7 root      20   0       0      0      0 S   0.0  0.0   0:00.16 ksoftirqd/0 

三、如何解读CPU负载情况

可以看到,"load average"一共返回三个值,这是3个平均值,分别代表的是系统在最近1分钟、5分钟、15分钟内,CPU的平均负载情况。这三个值落在什么范围内才算合理,超过什么范围会造成系统异常?在实际应用中怎么解读呢?哪个才是最准确的值呢?

首先我们分析一下这几个值的取值范围。拿单核CPU来举例,根据网上的经验值,一般将分水岭设成0.7。经验法则是这样的:

  • 当系统负荷持续小于0.7(指的是调整CPU核心数之后的相对值),表明系统非常健康,任务处理的很及时,效率很高,基本没有时延存在。
  • 当系统负荷持续大于0.7(指的是调整CPU核心数之后的相对值),表明系统有点忙了,你必须开始调查了,问题出在哪里,防止情况恶化。
  • 当系统负荷持续大于1.0(指的是调整CPU核心数之后的相对值),表明系统很忙了,你必须动手寻找解决办法,想办法把这个值降下来。
  • 当系统负荷持续大于3.0(指的是调整CPU核心数之后的相对值),表明系统非常非常忙了,甚至影响到正常的功能了,你得赶紧处理了;
  • 当系统负荷持续达到5.0(指的是调整CPU核心数之后的相对值),就表明你的系统有极其严重的问题,长时间没有响应,或者接近死机了。你不应该让系统达到这个值。

然后我们来解读一下这三个值的重要级别。在实际的使用中,我们一般认为,如果只有1分钟的系统负荷过大,其他两个时间段都很正常(指的是调整CPU核心数之后的相对值),这表明只是暂时现象,问题不大。如果连15分钟的平均系统负荷也偏大了(指的是调整CPU核心数之后的相对值),表明问题持续存在,则要引起重视了。所以,应该主要观察"15分钟系统负荷",将它作为电脑正常运行的指标。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章