最近研究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:~$ uptime20: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:~$ toptop - 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分钟系统负荷",将它作为电脑正常运行的指标。

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

  1. linux怎么增加cpu负载,Linux下的CPU平均负载

    linux下的CPU平均负载 一.注销登陆过的用户 先用w命令查看该用户tty号,然后用fuser -k tty号(或显示pts/*)就可以踢出了 先用w命令查看在线用户 然后 pkill -kill ...

  2. Linux进程管理:进程状态和CPU平均负载

    常见的linux进程状态如下: 关于源文件xmid,可以从Mind-Mapping获取 这里借助进程状态来描述一下linux系统中的平均负载的概念 当我们感觉到系统变慢时,通常通过top和uptime ...

  3. CPU 平均负载为多少更合理?

    CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理.程序运行的最终执行单元,相当于系统的"大脑".当 CPU 过于繁忙,就像" ...

  4. linux系统查看CPU使用含义、IO、内存、硬盘使用、负载

    一.Linux系统查看CPU使用率命令 在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况.而监控CPU的性能一般包括以下3点:运行队列.CPU使用率和上下文切换. 对于每 ...

  5. Linux系统的CPU使用率和Load

    为什么80%的码农都做不了架构师?>>>    好吧,我承认这个话题是老生常谈,我自己也在2009年刚接触性能测试时就已经开始关注并略知一二:然而,对于CPU使用率和系统负载Load ...

  6. 理解Linux和其他UNIX-Like系统上的平均负载

    理解Linux和其他UNIX-Like系统上的平均负载      Linux,Mac以及其他UNIX-like系统都能显示出"load average"信息.这些数字告诉你,你系统 ...

  7. linux cpu平均负载,关于linux系统CPU篇---平均负载

    1.什么是平均负载?(load average) 平均负载是指单位时间内平均活跃进程数,包括可运行状态的进程数,以及不可中断状态的进程(如等待IO,等待硬件设备响应) 2.如何查看平均负载? 使用to ...

  8. 分析linux系统的运行性能,Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  9. python 监控linux硬盘,Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例...

    由于项目的需要,需要做一个简单监控服务器的CPU利用率.CPU负载.硬盘使用率.内存利用率和服务器的各个端口的开启情况的程序,并把结果通知到监控平台,如果出现异常,监控平台打电话或者发短信通知给具体的 ...

最新文章

  1. 对于学习方式的一些思考
  2. int/double/string使用
  3. 认证模式之Basic模式
  4. 用户生命周期管理,整体运营的基础与核心
  5. 转:Google论文之三----MapReduce
  6. 第 2-3 课:抽象类和接口 + 面试题
  7. 风控人必知必会的征信知识
  8. python的优点有哪些-python语言有什么优势
  9. DayDayUp:罗振宇—2018.12.31年终秀——《时间的朋友》跨年演讲重点概览【文字+视频】
  10. java 10000以内的质数_10000以内的质数表.doc
  11. 【WebStorm学生认证】如何用学生邮箱进行JetBrains学生认证
  12. 地图选择区域遮罩层自定义控件实现
  13. 自我激励的二十种方法
  14. C语言练习:该存多少钱
  15. Linux如何退出VI编辑
  16. 在线炒股天载分析市场呈现出一片跌势
  17. 金蝶K3生产任务单批次号和工单号同步需求实现
  18. 企业WiFi解决方案,解决所有后顾之忧
  19. 环境工程原理复习资料
  20. 特斯拉Model Y 标准续航实测

热门文章

  1. iconv android 编译,将iconv编译成lua接口
  2. java map byte[],java中byte数组不能作为map的key使用
  3. ios中的视频采集及参数设置和相机操作
  4. CentOS 6.5通过ifconfig命令看不到网卡IP地址的解决方法
  5. Windows学习总结(6)——MindManager新手入门教程
  6. Windows2003不认3G以上内存时可以看看此文
  7. icem网格划分如何给内部面网格_icem结构化网格划分 ICEM里面设置一下就可以自动划分网格,为什么要用块?...
  8. matlab dividend,[原创]基于(Matlab/R/C++)的方差Gamma模型(Hull期权期货)随机抽样[by fantuanxiaot]...
  9. atomic原子类实现机制_深入了解Java atomic原子类的使用方法和原理
  10. java web服务 分层,java web分层之——三层架构