昨天查看 Nagios警报信息,发现其中一台服务器 CPU负载过重,机器为 CentOS系统。信息如下:
- 2011-2-15 (星期二) 17:50
- WARNING - load average: 9.73, 10.67, 10.49
还有前两个小时发出的警报信息:
- 2011-2-15 (星期二) 16:50
- WARNING - load average: 10.52, 10.10, 10.06
- 2011-2-15 (星期二) 15:40
- WARNING - 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的内核数
- $>grep ‘model name’ /proc/cpuinfo |uniq
- model name : Intel(R) Xeon(R) CPU E5320 @ 1.86GHz
- $>grep ‘physical id’ /proc/cpuinfo |sort |uniq |wc -l
- 2
- $>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