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


我们知道 , 平均负载最理想的情况是等于 CPU 个数 。所以在评判平均负载时 , 首先你要知道系统有几个 CPU , 这可以通过 top 命令或者从文件 /proc/cpuinfo 中读取 , 比如:
# 关于 grep 和 wc 的用法请查询它们的手册或者网络搜索$ grep 'model name' /proc/cpuinfo | wc -l2有了 CPU 个数 , 我们就可以判断出 , 当平均负载比 CPU 个数还大的时候 , 系统已经出现了过载 。
不过 , 且慢 , 新的问题又来了 。我们在例子中可以看到 , 平均负载有三个数值 , 到底该参考哪一个呢?
实际上 , 都要看 。三个不同时间间隔的平均值 , 其实给我们提供了 , 分析系统负载趋势的数据来源 , 让我们能更全面、更立体地理解目前的负载状况 。
打个比方 , 就像初秋时北京的天气 , 如果只看中午的温度 , 你可能以为还在 7 月份的大夏天呢 。但如果你结合了早上、中午、晚上三个时间点的温度来看 , 基本就可以全方位了解这一天的天气情况了 。
同样的 , 前面说到的 CPU 的三个负载时间段也是这个道理 。

如果 1 分钟、5 分钟、15 分钟的三个值基本相同 , 或者相差不大 , 那就说明系统负载很平稳 。但如果 1 分钟的值远小于 15 分钟的值 , 就说明系统最近 1 分钟的负载在减少 , 而过去15 分钟内却有很大的负载 。反过来 , 如果 1 分钟的值远大于 15 分钟的值 , 就说明最近 1 分钟的负载在增加 , 这种增加有可能只是临时性的 , 也有可能还会持续增加下去 , 所以就需要持续观察 。一旦 1分钟的平均负载接近或超过了 CPU 的个数 , 就意味着系统正在发生过载的问题 , 这时就得分析调查是哪里导致的问题 , 并要想办法优化了 。
这里我再举个例子 , 假设我们在一个单 CPU 系统上看到平均负载为 1.73 , 0.60 , 7.98 , 那么说明在过去 1 分钟内 , 系统有 73% 的超载 , 而在 15 分钟内 , 有 698% 的超载 , 从整体趋势来看 , 系统的负载在降低 。
那么 , 在实际生产环境中 , 平均负载多高时 , 需要我们重点关注呢?
在我看来 , 当平均负载高于 CPU 数量 70% 的时候 , 你就应该分析排查负载高的问题了 。一旦负载过高 , 就可能导致进程响应变慢 , 进而影响服务的正常功能 。
但 70% 这个数字并不是绝对的 , 最推荐的方法 , 还是把系统的平均负载监控起来 , 然后根据更多的历史数据 , 判断负载的变化趋势 。当发现负载有明显升高趋势时 , 比如说负载翻倍了 , 你再去做分析和调查 。
平均负载与 CPU 使用率现实工作中 , 我们经常容易把平均负载和 CPU 使用率混淆 , 所以在这里 , 我也做一个区分 。
可能你会疑惑 , 既然平均负载代表的是活跃进程数 , 那平均负载高了 , 不就意味着 CPU 使用率高吗?
我们还是要回到平均负载的含义上来 , 平均负载是指单位时间内 , 处于可运行状态和不可中断状态的进程数 。所以 , 它不仅包括了正在使用 CPU的进程 , 还包括等待 CPU和等待I/O的进程 。
而 CPU 使用率 , 是单位时间内 CPU 繁忙情况的统计 , 跟平均负载并不一定完全对应 。比如:
CPU 密集型进程 , 使用大量 CPU 会导致平均负载升高 , 此时这两者是一致的;I/O 密集型进程 , 等待 I/O 也会导致平均负载升高 , 但 CPU 使用率不一定很高;大量等待 CPU 的进程调度也会导致平均负载升高 , 此时的 CPU 使用率也会比较高 。
平均负载案例分析下面 , 我们以三个示例分别来看这三种情况 , 并用 IOStat、mpstat、pidstat 等工具 , 找出平均负载升高的根源 。
因为案例分析都是基于机器上的操作 , 所以不要只是听听、看看就够了 , 最好还是跟着我实际操作一下 。
前提准备下面的案例都是基于 Ubuntu 18.04 , 当然 , 同样适用于其他 linux 系统 。我使用的案例环境如下所示 。


推荐阅读