原文:http://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html
初识负载
我们平时使用top
或者uptime
时可以看到打印输出的系统平均负载(方便起见,后文都简称负载),分别是1分钟、5分钟和15分钟,如:
1 | $ uptime |
我们一般这样解读负载:
- 如果负载是
0.0
,那么系统就是空闲状态; - 如果1分钟负载比5分钟或15分钟负载大,易见系统负载正在增长;
- 反之,如果1分钟负载比5分钟或15分钟负载小,那么系统负载正在降低;
- 如果负载高于CPU核数,那么系统中可能存在性能问题;
但是系统负载到底是怎么统计的呢?
先说结论:
在Linux中,负载是单位时间内的运行及等待运行的任务数,包含TASK_UNINTERRUPTIBLE
状态(不受中断信号影响,一般是等待I/O和互斥锁的任务,在ps
和top
用D
作标记)中的任务。也就是说,Linux的系统负载不仅仅是CPU的使用,还把I/O等系统资源加入到了统计中。
为什么
为什么要将CPU外的资源纳入统计范围,下面是对这次commit的说明:
1 | From: Matthias Urlichs <urlichs@smurf.sub.org> |
也就说如果仅统计CPU的使用,一个重I/O的程序从高速磁盘转到低速硬盘运行时,系统负载就会出现下降的情形。显然这从用户的角度看是不合理的,而且不便于反映系统性能问题,所以应该把整个系统的资源使用纳入统计范围。
更好的度量项
虽然系统负载考虑了整个系统资源,但是也不能单纯用负载除以CPU核数的方法判定一个系统的运行状况,这个时候用检验值去做平行比较反而更好。
因为负载值的模凌两可,我们可以考虑用下列的值来代替:
- per-CPU utilization: eg, using mpstat -P ALL 1
- per-process CPU utilization: eg, top, pidstat 1, etc.
- per-thread run queue (scheduler) latency: eg, in /proc/PID/schedstats, delaystats, perf sched
- CPU run queue latency: eg, in /proc/schedstat, perf sched.
- CPU run queue length: eg, using vmstat 1 and the ‘r’ column.
小结
这里只摘抄转译了原文部分内容,并没有全部搬运。有兴趣继续深入的同学可以在原文阅览更多内容,地址见文首。