在我们在使用诸葛运帷或其他运维监控软件产品对操作系统进行性能监控时,会发现在衡量CPU资源的监控指标中,有一个叫做“Load average”的指标项。我们都知道,衡量系统CPU资源的常用指标是CPU使用率。那么这个“Load average”,又是指什么呢?
Load average,也叫做“平均负载”,是Linux操作系统所独有的监控指标。平均负载与CPU使用率,都可以用来衡量系统的繁忙度,但其侧重有所不同。
CPU使用率,是从时间维度考量CPU的资源占用情况。要计算它,首先要引入两个关于“时间”的概念。它们分别是CPU繁忙时间和CPU空闲时间。从字面意思不难理解,繁忙时间,就是指CPU处于繁忙状态的时间。在这个时间内,CPU通常会满负荷运转。而空闲时间,则是指在这个时间段内,CPU没有进行任务处理的工作。这样,我们只需要在一段时间内,用CPU繁忙时间,除以CPU繁忙时间加CPU空闲时间之和,就可以算出CPU使用率。反之,我们也可以通过CPU使用率,反推出CPU处于繁忙或空闲状态的时长。以十秒钟为例,假如在这十秒钟之内,CPU使用率为百分之九十,则说明系统的CPU有九秒钟处于满负荷运转状态。
现在让我们再来说说负载。
负载,则是从“执行任务”的角度考虑系统的繁忙情况。注意,我们这里只是说“负载”,却并没有说“CPU负载”。这是为什么呢?
在Unix操作系统中,负载指的是在一段时间内,有多少个任务正在使用或等待CPU资源。所以在Unix系统中,负载也可以被称为“CPU负载”。假如我们有三个需要计算圆周率的任务,其中有两个任务正在执行,另外一个任务因为CPU资源用尽,无暇运行而处于等待状态,则此时我们的负载数为3。
与Unix系统稍有不同,在Linux系统中,负载则是指在一段时间内,有多少个任务正处于“等待”状态。任务可能在等待CPU资源,也可能在等待网络资源,还有可能在等待磁盘读写或其他资源。此时,仍然把将“负载”称为“CPU负载”,就不太严谨了。还是以圆周率计算任务为例,这次我们对它稍作改动。该任务首先需要使用CPU来计算圆周率数值,然后将计算结果写入磁盘,最后通过网络将数据上传到我们的FTP服务器。假如还是有三个任务在运行,一个正占用CPU进行运算,一个正向磁盘写入数据,而另外一个正在通过FTP上传数据,则此时虽然我们的CPU并没有满负荷运行,我们的负载却仍然是3。
上述例子可能并不恰当,但基本上能让我们搞明白负载是怎么一回事。
好了,现在我们有了负载监控指标这把武器,在日常运维监控工作中,又能如何运用它去分析系统运行问题呢?
遇到Linux系统负载特别高的情况,我们先别着急进行CPU扩容。不妨先看看其他资源占用情况。
我们可以先看看系统内存使用率。如果系统内存资源耗尽,则操作系统会频繁的进行物理内存与虚拟内存的调入调出操作,从而将内存空间释放出来,给着急使用内存的任务。由于虚拟内存是存储与磁盘之上的,频繁读写会引起磁盘读写能力达到上限,引发磁盘读写排队,进而导致进程等待。此时,我们应当做的事情是为服务器扩充内存资源。
假如我们的内存非常空闲,那就需要再看看磁盘IO情况。如果磁盘IO很高,则说明磁盘读写非常繁忙。当磁盘IO读写频次达到上限时,则新任务要向磁盘读取或写入数据,就会触发等待。
此时,我们需要设法提升磁盘读写能力,比如更换转速更高的磁盘,或者使用SSD固态硬盘。另外,用多块磁盘分担不同的磁盘读写任务,也是一个不错的选择。
也有可能我们的磁盘也不是很繁忙,接下来可以看看网络流量情况。持续、大量的数据传输,会导致网络带宽用尽,进而使新任务的网络传输请求进入等待状态,也会推高系统的负载值。
现在,我们从负载的几个非CPU维度都进行了考量。如果内存占用不高、硬盘不繁忙、网络也没有发生拥塞的话,就需要回到CPU资源的层面,来分析问题了。
先看看负载的三个数值,它们分别是一分钟、五分钟和十五分钟负载。通常来说,一分钟负载会以“毛刺”的方式呈现,五分钟负载会相对平缓,而十五分钟负载则会更平缓一些。如果一分钟负载的突刺很高,而五分钟负载的起伏不大的时候,说明计算任务的编排不太合理,建议将消耗资源的程序错开时间来执行。当然,实际情况会更复杂一些,可能在那个时间段确实业务量非常大,比如医院门诊量的高峰期,商场人流量的高潮期,都会导致系统的负载骤然升高。那么此时就真的需要考虑添加CPU资源了。