Linux下的load average

在Linux中,当我们使用top命令或uptime命令时,都会发现一个这样的字段:load average


load average后面三个数字分别代表不同时间段即一分钟、五分钟和十五分钟的系统平均负载。

当然我们还可以在/proc下查看:cat /proc/loadavg

第四个值的分子是正在运行的进程数,分母为总进程数;

第五个值是最近运行的进程id;

什么是系统平均负载?

Linux下,系统平均负载指的是运行队列平均长度,也就是等待cpu的平均进程数。

Linux下load average是如何计算的?

我们可以在源码/kernel/timer.c中看到计算方法:


源码中,我们可以看到有一个数组avenrun[3],这个数组存放的就是一分钟、五分钟和十五分钟的load average值;

函数calc_load是具体的计算方法,参数ticks表示采样间隔(linux系统是5s进行一次load采样),active_tasks表示当前活跃的进程数,该值可以调用 count_active_tasks()进行获取,因此影响load average大小的直接因素是系统中活动的进程数

 count_active_tasks()函数在源码中的定义如下:


nr_running表示正在运行或准备运行的进程,计算方法如下:在/kernel/sched.c中


nr_uninterruptible表示不可中断睡眠状态进程,计算方法如下:在/kernel/sched.c中


通过获取的值作为参数调用CALC_LOAD分别计算三个loadaverage;CALC_LOAD在/include/linux/sched.h中定义:


其他参数定义如下:


系统负荷经验法则:(单核)

load < 0.7:系统很闲,可以考虑多部署一些服务;

0.7<load <1:系统状态还不错;

load >= 1:系统快要处理不过来,必须想办法将这个值降下来;

load 达到5.0表明系统有很严重的问题,长时间没有响应或死机;

如果是多核处理器或有多个cpu时,我们具体应该参考这三个时间的那个时间呢?

给大家推荐一篇博客:http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html这篇博客对上述问题有详细的介绍。