Thinking_Out_Loud

Linux系统负载

2018-09-27

原文:http://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html

初识负载

我们平时使用top或者uptime时可以看到打印输出的系统平均负载(方便起见,后文都简称负载),分别是1分钟、5分钟和15分钟,如:

1
2
$ uptime
22:20:29 up 9 min, 0 users, load average: 0.52, 0.58, 0.59

我们一般这样解读负载:

  • 如果负载是0.0,那么系统就是空闲状态;
  • 如果1分钟负载比5分钟或15分钟负载大,易见系统负载正在增长;
  • 反之,如果1分钟负载比5分钟或15分钟负载小,那么系统负载正在降低;
  • 如果负载高于CPU核数,那么系统中可能存在性能问题;

但是系统负载到底是怎么统计的呢?


先说结论:

在Linux中,负载是单位时间内的运行及等待运行的任务数,包含TASK_UNINTERRUPTIBLE状态(不受中断信号影响,一般是等待I/O和互斥锁的任务,在pstopD作标记)中的任务。也就是说,Linux的系统负载不仅仅是CPU的使用,还把I/O等系统资源加入到了统计中。

为什么

为什么要将CPU外的资源纳入统计范围,下面是对这次commit的说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
From: Matthias Urlichs <urlichs@smurf.sub.org>
Subject: Load average broken ?
Date: Fri, 29 Oct 1993 11:37:23 +0200


The kernel only counts "runnable" processes when computing the load average.
I don't like that; the problem is that processes which are swapping or
waiting on "fast", i.e. noninterruptible, I/O, also consume resources.

It seems somewhat nonintuitive that the load average goes down when you
replace your fast swap disk with a slow swap disk...

Anyway, the following patch seems to make the load average much more
consistent WRT the subjective speed of the system. And, most important, the
load is still zero when nobody is doing anything. ;-)

也就说如果仅统计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.

小结

这里只摘抄转译了原文部分内容,并没有全部搬运。有兴趣继续深入的同学可以在原文阅览更多内容,地址见文首。

Tags: Linux