uptime

每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统 的负载情况

1
2
$ uptime
22:33  up 1 day, 12:20, 4 users, load averages: 1.92 2.56 3.43

每列含义

  • 22:33 当前时间
  • up 1 day,12:20 系统运行时间
  • 4 users 正在登录用户数
  • load averages: 1.92 2.56 3.43 是过去 1 分钟、5 分钟、15 分钟的平均负载

平均负载

平均负载是指单位时间内,系统处于可运行状态(CPU正在处理)和不可中断状态(等待CPU处理)的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

既然平均的是活跃进程数,那么最理想的,就是每个 CPU 上都刚好运行着一个进程,这样每个 CPU 都得到了充分利用.

例如: 当平均负载为 2时

  • 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
  • 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲
  • 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU

负载为多少是合理的

  1. 获取当前CPU个数 $ grep 'model name' /proc/cpuinfo | wc -l
  2. 当平均负载比 CPU 个数还大的时候,系统已经出现了过载。

观察1分钟,5分钟,15分钟的情况

  1. 如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
  2. 但如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15分钟内却有很大的负载。
  3. 如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察。一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了

经验

当平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题了. 一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。

平均负载和CPU使用率

平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。

  1. CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的。
  2. I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高。
  3. 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

总结

平均负载反映了整体的负载情况 平均负载高有可能是 CPU 密集型进程导致的 平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了