如何理解linux的平均负载?

209 阅读4分钟

负载多少时合理?

在评估这个值的时候,首先我们要看下当前有多少个逻辑CPU,一般我们直接看/proc/cpuinfo的数据即可

那么比如我这台机器,看到的就是8个逻辑核心了。 有了CPU个数,我们就可以判断出,当平均负载比CPU个数还大的时候,系统已经出现了过载。 不过这个观察也是要评估多个指标的,我们要同时用1分钟5分钟15分钟的值来大概的估算这个设备的负载是呈现上升或者下降的趋势,其实最好的方式是通过监控的手段,采集足够多的load值,这样可以更精准的知道自己设备的负载情况。

平均负载与CPU使用率 在日常使用中,我们经常容易把平均负载和CPU使用率混淆,这里我们做下区分。 可能我们会有疑惑,既然平均负载代表的是活跃进程数,那么平均负载搞了,不就意味着CPU使用率高了吗? 这里我们还得回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数,所以,他不仅包扩了正在使用CPU的进程,还包括等待CPU和等待I/O的进程。 而CPU使用率,是单位时间内CPU繁忙情况的统计,和平均负载并不一定完全对应。比如:

CPU密集型进程,使用大量CPU会导致平均负载升高,此时这两者是一致的。 I/O 密集型进程, 等待I/O也会导致平均负载升高,但是CPU使用率不一定很高。 大量等待CPU的进程调用也会导致平均负载升高,此时的CPU使用率也会比较高。

平均负载案例分析 这里会用到2个工具,stress和sysstat stress是一个Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。 sysstat是一个linux性能工具,用来监控和分析系统的性能,以下案例中会用到这个包的2个命令mpstat和pidstat。

mpstat 是一个常用的多核CPU性能分析工具用来实时查看每个CPU的性能指标,一级所有CPI的平均指标。 pidstat 是一个常用的进程性能分析工具,用来实时查看进程的CPU、内存、I/O以及上下文切换等性能指标。 [root@ylss-web ~]# yum install stress -y

场景一:cpu密集型进程 我们打开终端一运行stree命令,模拟一个CPU使用率100%的场景:

我们打开终端二,查看CPU负载的上升状态

打开终端三,查看CPU使用状态

这里我们可以看到, CPU的使用率一直处于非常高的状态,使用这个工具可以持续看到状态的变化。

那么,到底是哪个进程导致了CPU飙升呢? 你可以使用pidstat来查询:

场景二:I/O 密集型进程 首先还是运行stress命令,但这次模拟I/O压力,即不停的执行sync: 打开终端一,执行stress

打开终端二

这里,也会看到,load会不断的升高

打开终端三

这里看到,CPU的使用(usr)不是很高,反而sys使用的比较高,分布在了2个CPU上,约等于100% 同时可以看到iowait的值也升高了一些,由于我的设备全是ssd磁盘,所以这个io的性能可能会稍微好一些。

那么到底是哪个进程,导致系统CPU使用率特别高,及iowait特别高呢?

通过以上的信息,可以很清晰的看到,是由于stress进程出现了大量的系统使用。

场景三:大量进程的场景 当系统中运行进程超出CPU运行能力时,就会出现等待CPU的进程。 我们打开终端一:使用stress模拟24个进程:

打开终端二:看下当前的负载值

打开终端三:看下进程的资源使用信息

我们发现,运行的24个stress进程,出现了资源争抢的问题,既然出现了资源争抢,就会出现等待时间wait。