操作系统

教你如何查看Linux的CPU负载

Jager · 4月29日 · 2014年 · · · 1510次已读

记得博主以前被问到 CPU 负载如何才算高的时候,出过一次糗,具体就不记录了。。。在网上找了一篇比较详细的 Linux 下的 CPU 负载算法教程,科普一下。不感兴趣,或看不懂的朋友无视即可,不必浪费时间哈。


昨天查看 Nagios 警报信息,发现其中一台服务器 CPU 负载过重,机器为 CentOS 系统。信息如下:

2011-2-15 (星期二) 17:50   WARNING - load average: 9.73, 10.67, 10.49

还有前两个小时发出的警报信息:
2011-2-15 (星期二) 16:50WARNING - load average: 10.52, 10.10, 10.06
2011-2-15 (星期二) 15:40WARNING - load average: 8.27, 9.23, 9.48

一、警报信息的三个参数到底是什么意思?

9.73、10.67、10.49 分别代表前一分钟,五分钟,十五分钟的平均 CPU 负载,最重要的指标是最后一个数字,即前 15 分钟的平均 CPU 负载,这个数字越小越好。所谓 CPU 负载指的是一段时间内任务队列的长度,通俗的讲,就是一段时间内一共有多少任务在使用或等待使用 CPU。

二、除了 Nagios,还有哪些工具可以查看 CPU 负载?

可以使用 top 命令、uptime 命令,特别是 top 命令,功能强大,不仅仅可以用来查看 CPU 负载。

三、CPU 负载怎么理解?是不是 CPU 利用率?

这里要区别 CPU 负载和 CPU 利用率,它们是不同的两个概念,但它们的信息可以在同一个 top 命令中进行显示。CPU 利用率显示的是程序在运行期间实时占用的 CPU 百分比,而 CPU 负载显示的是一段时间内正在使用和等待使用 CPU 的平均任务数。CPU 利用率高,并不意味着负载就一定大。网上有篇文章举了一个有趣比喻,拿打电话来说明两者的区别,我按自己的理解阐述一下。 某公用电话亭,有一个人在打电话,四个人在等待,每人限定使用电话一分钟,若有人一分钟之内没有打完电话,只能挂掉电话去排队,等待下一轮。电话在这里就相当于 CPU,而正在或等待打电话的人就相当于任务数。 在电话亭使用过程中,肯定会有人打完电话走掉,有人没有打完电话而选择重新排队,更会有新增的人在这儿排队,这个人数的变化就相当于任务数的增减。为了统计平均负载情况,我们 5 秒钟统计一次人数,并在第 1、5、15 分钟的时候对统计情况取平均值,从而形成第 1、5、15 分钟的平均负载。 有的人拿起电话就打,一直打完 1 分钟,而有的人可能前三十秒在找电话号码,或者在犹豫要不要打,后三十秒才真正在打电话。如果把电话看作 CPU,人数看作任务,我们就说前一个人(任务)的 CPU 利用率高,后一个人(任务)的 CPU 利用率低。 当然, CPU 并不会在前三十秒工作,后三十秒歇着,只是说,有的程序涉及到大量的计算,所以 CPU 利用率就高,而有的程序牵涉到计算的部分很少,CPU 利用率自然就低。但无论 CPU 的利用率是高是低,跟后面有多少任务在排队没有必然关系。

四、了解了 CPU 负载的含义,我们如何来降低服务器的 CPU 负载呢?

最简单办法的是更换性能更好的服务器,不要想着仅仅提高 CPU 的性能,那没有用,CPU 要发挥出它最好的性能还需要其它软硬件的配合。 在服务器其它方面配置合理的情况下,CPU 数量和 CPU 核心数(即内核数)都会影响到 CPU 负载,因为任务最终是要分配到 CPU 核心去处理的。两块 CPU 要比一块 CPU 好,双核要比单核好。 因此,我们需要记住,除去 CPU 性能上的差异,CPU 负载是基于内核数来计算的!有一个说法,“有多少内核,即有多少负载”。

五、那么,本文开头的 CPU 负载分担到每个 CPU 上的负载是多少呢?

那就要看我这台服务器有一共有多少个内核了。 Linux里有一个/proc 目录,存放的是当前运行系统的虚拟映射,其中有一个文件为 cpuinfo,这个文件里存放着 CPU 的信息。我们可以直接打开查看,或者过滤关键字进行查看,因为文件内容比较多,所以一般我们需要过滤关键字。 /proc/cpuinfo 文件按逻辑 CPU 而非真实 CPU 分段落显示信息,每个逻辑 CPU 的信息占用一个段落,第一个逻辑 CPU 标识从 0 开始。我们首先要明白这一点,至于什么是逻辑 CPU,下面会提到。要理解该文件中的 CPU 信息,有几个相关的概念要知道: processor:逻辑 CPU 的标识 model name:真实 CPU 的型号信息 physical id:真实 CPU 和标识 cpu cores:真实 CPU 的内核数

#查看 CPU 型号:   
$>grep 'model name' /proc/cpuinfo |uniq   
model name : Intel(R) Xeon(R) CPU E5320 @ 1.86GHz   
  
#查看 CPU 物理个数   
$>grep 'physical id' /proc/cpuinfo |sort |uniq |wc -l   
2  
  
#查看单个 CPU 是几核的   
$>grep 'cpu cores' /proc/cpuinfo |uniq   
2

可以看出,该服务器 CPU 型号为 Intel(R) Xeon(R) CPU E5320,双 CPU,每个 CPU 都是双核,相当于服务器有 4 个内核。 前面我们说 CPU 负载是基于 CPU 内核数计算的,那么以前十五分钟的平均负载数 10.49 为例,我们可以得出,这台服务器每个 CPU 的负载为 5.245,再分配到内核上,每个内核的负载为 2.6 左右。 这个负载是否是合理的呢?那就要看理想 CPU 负载的标准是什么样子的了。

六、CPU 负载为多少才算比较理想?

这个有争议,各有各的说法,我个人比较赞同 CPU 负载小于等于 0.7 算是一种理想状态。 不管某个 CPU 的性能有多好,1 秒钟能处理多少任务,我们可以认为它无关紧要,虽然事实并非如此。在评估 CPU 负载时,我们只以 5 秒钟为单位为统计任务队列长度。如果每隔 5 秒钟统计的时候,发现任务队列长度都是 1,那么 CPU 负载就为 1。假如我们只有一个单核的 CPU,负载一直为 1,意味着没有任务在排队,还不错。 上面提到的我那台服务器,是双核又 CPU,等于是有 4 个内核,每个内核的负载为 1 的话,总负载为 4。这就是说,如果我那台服务器的 CPU 负载长期保持在 4 左右,还可以接受。但实际上 CPU 负载已经达到 9 以上了,所以就很麻烦了。  但是每个内核的负载为 1,并不能算是一种理想状态!这意味着我们的 CPU 一直很忙,不得清闲。网上有说理想的状态是每个内核的负载为 0.7 左右,我比较赞同,0.7 乘以内核数,得出服务器理想的CPU 负载,比如我这台服务器,负载在 3.0 以下就可以。

七、下面关于逻辑 CPU 的描述,全部来自网上:

现在的服务器一般都使用了“超线程”(Hyper-Threading,简称 HT)技术来提高 CPU 的性能。超线程技术是在一颗 CPU 同时执行多个程序而共同分享一颗 CPU 内的资源,理论上要像两颗 CPU 一样在同一时间执行两个线程。 虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的 CPU 那样,每各 CPU 都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗 CPU 的性能。 具有超线程技术的 CPU 还有一些其它方面的限制。

八、学习过程中参考了下列文档,在此一并感谢:

http://www.gracecode.com/archives/2973/

http://xuev.blogbus.com/logs/37835586.html (已失效)

6 条回应
  1. 爱浮夸 爱生活! 2014-4-29 · 15:27

    学习了。。。

  2. 屠龙 2014-4-29 · 17:57

    不错不错,写的很详细,有空看下好

    • avatar
      Jager 2014-4-29 · 18:41

      转载的

  3. 阿塔历斯 2014-6-8 · 0:07

    写的很好啊,不过现在linux都没研究了

  4. 重量 2014-6-25 · 23:35

    好的 参考下 load average: 8.27, 9.23, 9.48 是几核的啊

  5. 景小 2018-5-27 · 13:50

    写的很棒,感觉对负载有了全新的认识