01uptime命令通常我们发现系统变慢的时候,我们会执行top或者uptime命令来查看当前的系统负载。比如如下,我执行了uptime,系统返回了结果。[root@lincoding~]#uptime08:31:49up27min,1user,loadaverage:0.07,0.04,0.00前面几栏的信息相信大家都很熟悉了。它们分别是当前时间、系统运行时间和正在登录的用户数,最后一个是系统的平均负载。08:31:49//当前时间27分钟//系统运行时间1用户//正在登录的用户数loadaverage:0.07,0.04,0.00//loadaverageLoadAverage的三个数字,后面是过去1分钟、5分钟、15分钟的平均负载。通过观察这三个数字的大小,可以简单判断系统的负载是处于下降趋势还是上升趋势。如果三个数字loadaverage:1.00、5.00、10.00依次增加,说明过去1分钟的系统负载小于过去15分钟的系统负载,说明系统负载呈下降趋势。如果loadaverage的三个数字:10.00、5.00、1.00依次递减,说明过去1分钟的系统负载大于过去15分钟的系统负载,说明系统负载在上升。如果loadaverage这三个数:0.07、0.04、0.0基本一致,或者相差不大,说明系统负载稳定。因此,分析系统的负载情况,需要看三个不同时间间隔的平均值。02平均负载的概念很多人很容易将平均负载理解为单位时间的CPU使用率,这是不正确的。平均负载确实与CPU使用率有关系,但不是直接关系。简单来说,平均负载是指单位时间内系统处于可运行、不可中断状态的平均进程数,即平均活跃进程数,与CPU使用率没有直接关系。可运行状态是指进程正在使用CPU或等待CPU,即ps命令中看到的R状态的进程。不可中断状态指的是处于核心进程中的进程,这些进程是不能被中断的,比如最常见的等待硬件设备的I/O响应,也就是图中看到的D状态的进程ps命令。因此,平均负载实际上是平均活跃进程数,可以更直观地理解为单位时间内的活跃进程数。由于平均值是活动进程数,理想情况下,每个CPU上恰好有一个进程在运行,这样每个CPU都得到充分利用。例如,当loadaverage为2时,意味着:在一个只有2个CPU的系统上,意味着所有的CPU刚好被占用。在具有4个CPU的系统上,这意味着CPU有50%空闲。在只有1个CPU的系统上,这意味着一半的进程无法竞争CPU。03什么是平均负载?在判断你当前系统的平均负载是否合理时,首先要知道系统有多少个CPU。您可以使用lscpu命令或从文件/proc/cpuinfo中读取它来检查CPU的数量。Number[root@lincoding~]#lscpuArchitecture:x86_64CPUop-mode(s):32-bit,64-bitByteOrder:LittleEndianCPU(s):4#这里的数字代表CPU的数量....#来自文件/proc查看/cpuinfo[root@lincoding~]#grep'modelname'/proc/cpuinfo|中的CPU数量wc-l4有了CPU个数,我们可以判断当平均负载大于CPU个数时,系统已经过载。让我在这里再举一个例子。假设我们在单CPU系统上看到平均负载为1.73、0.60和7.98。过去1分钟,系统过载73%。过去15分钟,超载698%。从总体上看,系统的负载在下降。当平均负载高于CPU数量的70%时,就需要分析和排查负载过高的问题了。一旦负载过高,可能会导致进程响应缓慢,从而影响服务的正常功能。04AverageloadandCPUusage我们经常混淆平均负载和CPU使用率,所以在这里,我也做个区分。同样,平均负载是指单位时间内可运行且不可中断的进程数。所以,它不仅包括正在使用CPU的进程,还包括等待CPU和等待I/O的进程。CPU使用率是单位时间内CPU繁忙度的统计,不一定与平均负载完全对应。例如:对于一个CPU密集型进程,大量使用CPU会导致平均负载增加,此时两者是一致的;对于I/O密集型进程,等待I/O也会导致平均负载增加,但CPU占用率并不一定高;大量等待CPU的进程调度也会导致平均负载增加,此时CPU占用率会比较高。05Averageloadincreaseanalysiscommand我们现在清楚的知道导致平均负载高的情况,不仅要看CPU占用率,还要观察系统I/O等待时间是否高。当发现平均负载增加时,可以使用mpstat命令查看CPU的性能。#-PALL表示监控所有CPU,后面的数字1表示间隔1秒输出一组数据$mpstat-PALL1Linux2.6.32-431.el6.x86_64(lzc)11/05/2019_x86_64_(2CPU)07:51:45PMCPU%usr%nice%sys%iowait%irq%soft%steal%guest%idle07:51:50PM所有42.900.0049.390.410.004.560.000.002.7407:51:50PM044.340.40.62.860.000.003.6807:51:50PM141.570.0049.800.400.006.430.000.001.81由上可知CPU用户层(%usr)使用率高达45%;CPU系统层(%sys)使用率高达50%左右;CPUI/0-等待(%iowait)占用率为0.41%;CPU闲置率(%idle)仅为2~3%。可以推断,由于CPU使用率导致平均负载较高。假设只有CPUI/0等待(%iowait)占用率高,CPU用户层和系统层使用容易,那么平均负载增加的原因就是iowait的增加。在判断平均负载增加是因为CPU占用增加还是iowait增加后,我们需要定位是哪个进程引起的。可以使用pidstat查询:#间隔1秒输出一组数据,-u表示CPU指标$pidstat-u108:07:55PMPID%usr%system%guest%CPUCPUCommand08:07:56下午40.001.000.001.000KSOFTIRQD/008:07:56下午90.001.000.001.001KSOFTIRQD/108:07:56下午110.0016.0016.0008:07:56下午12.010事件06:06下午0.07156167.006.000.0013.001pppoe08:07:56PM27456.006.000.0012.001pppoe可以发现events/0和events/1内核进程的CPU占用率很高,所以这两个进程可能会导致平均负载升得很高。06总结平均负载提供了系统整体性能的快速视图,反映了整体负载情况。但是仅仅看loadaverage本身,我们并不能直接找出瓶颈在哪里。因此,在了解平均负载时,还应注意:平均负载高可能是CPU密集型进程造成的;平均负载高并不一定意味着CPU使用率高,可能是I/O更忙;当你发现负载偏高时,可以使用mpstat、pidstat等工具辅助分析负载的来源。
