怎么提升Linux性能,看完这篇文章,彻底掌握"平均负载"

每次发现系统变慢时 , 我们通常做的第一件事 , 就是执行 top 或者 uptime 命令 , 来了解系统的负载情况 。比如像下面这样 , 我在命令行里输入了 uptime 命令 , 系统也随即给出了结果 。
$ uptime02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88但我想问的是 , 你真的知道这里每列输出的含义吗?
我相信你对前面的几列比较熟悉 , 它们分别是当前时间、系统运行时间以及正在登录用户数 。
02:34:03 // 当前时间up 2 days, 20:14 // 系统运行时间1 user // 正在登录用户数而最后三个数字呢 , 依次则是过去 1 分钟、5 分钟、15 分钟的平均负载(LoadAverage) 。
平均负载?这个词对很多人来说 , 可能既熟悉又陌生 , 我们每天的工作中 , 也都会提到这个词 , 但你真正理解它背后的含义吗?如果你们团队来了一个实习生 , 他揪住你不放 , 你能给他讲清楚什么是平均负载吗?
其实 , 6 年前 , 我就遇到过这样的一个场景 。公司一个实习生一直追问我 , 什么是平均负载 , 我支支吾吾半天 , 最后也没能解释明白 。明明总看到也总会用到 , 怎么就说不明白呢?后来我静下来想想 , 其实还是自己的功底不够 。
于是 , 这几年 , 我遇到问题 , 特别是基础问题 , 都会多问自己几个“为什么” , 以求能够彻底理解现象背后的本质原理 , 用起来更灵活 , 也更有底气 。
今天 , 我就带你来学习下 , 如何观测和理解这个最常见、也是最重要的系统指标 。
我猜一定有人会说 , 平均负载不就是单位时间内的 CPU 使用率吗?上面的 0.63 , 就代表CPU 使用率是 63% 。其实并不是这样 , 如果你方便的话 , 可以通过执行 man uptime 命令 , 来了解平均负载的详细解释 。
简单来说 , 平均负载是指单位时间内 , 系统处于可运行状态和不可中断状态的平均进程数 , 也就是平均活跃进程数 , 它和 CPU 使用率并没有直接关系 。这里我先解释下 , 可运行状态和不可中断状态这俩词儿 。
所谓可运行状态的进程 , 是指正在使用 CPU 或者正在等待 CPU 的进程 , 也就是我们常用ps 命令看到的 , 处于 R 状态(Running 或 Runnable)的进程 。
不可中断状态的进程则是正处于内核态关键流程中的进程 , 并且这些流程是不可打断的 , 比如最常见的是等待硬件设备的 I/O 响应 , 也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep , 也称为 Disk Sleep)的进程 。
比如 , 当一个进程向磁盘读写数据时 , 为了保证数据的一致性 , 在得到磁盘回复前 , 它是不能被其他进程或者中断打断的 , 这个时候的进程就处于不可中断状态 。如果此时的进程被打断了 , 就容易出现磁盘数据与进程数据不一致的问题 。
所以 , 不可中断状态实际上是系统对进程和硬件设备的一种保护机制 。
因此 , 你可以简单理解为 , 平均负载其实就是平均活跃进程数 。平均活跃进程数 , 直观上的理解就是单位时间内的活跃进程数 , 但它实际上是活跃进程数的指数衰减平均值 。这个“指数衰减平均”的详细含义你不用计较 , 这只是系统的一种更快速的计算方式 , 你把它直接当成活跃进程数的平均值也没问题 。
既然平均的是活跃进程数 , 那么最理想的 , 就是每个 CPU 上都刚好运行着一个进程 , 这样每个 CPU 都得到了充分利用 。比如当平均负载为 2 时 , 意味着什么呢?

在只有 2 个 CPU 的系统上 , 意味着所有的 CPU 都刚好被完全占用 。在 4 个 CPU 的系统上 , 意味着 CPU 有 50% 的空闲 。而在只有 1 个 CPU 的系统中 , 则意味着有一半的进程竞争不到 CPU 。
平均负载为多少时合理讲完了什么是平均负载 , 现在我们再回到最开始的例子 , 不知道你能否判断出 , 在 uptime命令的结果里 , 那三个时间段的平均负载数 , 多大的时候能说明系统负载高?或是多小的时候就能说明系统负载很低呢?


推荐阅读