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这篇博客对上述问题有详细的介绍。