HiSEN

理解 Linux Load Averages

零、背景

最近做压力测试,不同的系统的机器监控数据差异明显
A 系统:CPU 高 load 低
B 系统:CPU 低 load 高

那么是什么导致 A B 系统出现这种情况?
CPU 高了系统肯定跑不动了,那么 load 多高代表系统跑不动呢?

一、解释

  1. A 系统的原因
    CPU 很忙,没有等待其它资源,瓶颈在 CPU。
  2. B 系统的原因
    等待磁盘 I/O 完成的进程过多,导致进程队列长度过大,
    但是 CPU 运行的进程却很少,这样就导致负载过大,但 CPU 使用率低,瓶颈不在 CPU,可能在 I/O。

二、load averages 知识

  1. Linux 系统下代表的是 system load averages。
  2. Linux load averages track not just runnable tasks, but also tasks in the uninterruptible sleep state.
    Linux 平均负载不仅跟踪可运行的任务,还跟踪处于不可中断睡眠状态的任务。

  3. On Linux, load averages are (or try to be) “system load averages”, for the system as a whole, measuring the number of threads that are working and waiting to work (CPU, disk, uninterruptible locks). Put differently, it measures the number of threads that aren’t completely idle. Advantage: includes demand for different resources.
    在 Linux 上,负载平均值是(或试图是)“系统负载平均值” ,对于整个系统来说,测量正在工作和等待工作的线程数(CPU、磁盘、不可中断锁)。换句话说,它测量的是没有完全空闲的线程数量。优势: 包括对不同资源的需求。

  4. In 1993, a Linux engineer found a nonintuitive case with load averages, and with a three-line patch changed them forever from “CPU load averages” to what one might call “system load averages.” His change included tasks in the uninterruptible state, so that load averages reflected demand for disk resources and not just CPUs.
    1993年,一位 Linux 工程师发现了一个与平均负载不直观的案例,一个三行补丁永远地将它们从“ CPU 负载平均值”改变为人们可能称之为“系统负载平均值”他的更改包括处于不可中断状态的任务,因此平均负载反映了对磁盘资源的需求,而不仅仅是 cpu。

三、总结

  1. linux load averages 数字大,代表系统压力大;
  2. load 高可能的原因有(CPU、I/O、不可中断锁);
  3. load 1min load 5min load 15min,从左到右递增说明负载在增加,递减说明负载在降低;
  4. 负载多大才算高,没有定论,得看是否影响业务,如果业务正常那多半是没有问题的;

四、load 优化

  1. 优化算法,减少 CPU 计算;
  2. 减少 I/O 交互的次数,以及大小;
  3. 分布式系统水平扩展更多的机器;

五、参考

  1. Linux Load Averages: Solving the Mystery (发表于 2017 年)
  2. 理解Linux系统负荷 (发表于 2011 年)
  3. Linux中CPU使用率低负载高