Linux性能优化(一)

如何理解平均负载

uptime # uptime root@iZbp14ipzpabr30yllskn4Z 14:37:58 up 403 days, 1:48, 4 users, load average: 0.74, 0.63, 0.60 ~ # 而最后三个数字呢,依次则是过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average)。 平均负载 平均负载是指单位时间内,系统处**于可运行状态和不可中断状态**的平均进程数,也就是**平均活跃进程数**,它和 CPU 使用率并没有直接关系。这里我先解释下,可运行状态和不可中断状态这俩词儿。 所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。 不可中断状态实际上是系统对进程和硬件设备的一种保护机制。 既然平均的是活跃进程数,那么最理想的,就是每个 CPU 上都刚好运行着一个进程,这样每个 CPU 都得到了充分利用。比如当平均负载为 2 时,意味着什么呢? * 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。 * 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。 * 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。 查看CPU个数 [root@VM-64-25-centos ~]# grep 'model name' /proc/cpuinfo | wc -l 8 [root@VM-64-25-centos ~]# 平均负载为多少时合理 * 如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。 * 但如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内却有很大的负载。 * 反过来,如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察。一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了。 那么,在实际生产环境中,平均负载多高时,需要我们重点关注呢? **在我看来,当平均负载高于 CPU 数量 70% 的时候,**你就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。 **但 70% 这个数字并不是绝对的**,最推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势。当发现负载有明显升高趋势时,比如说负载翻倍了,你再去做分析和调查。 平均负载与 CPU 使用率 现实工作中,我们经常容易把平均负载和 CPU 使用率混淆,所以在这里,我也做一个区分。 可能你会疑惑,既然平均负载代表的是活跃进程数,那平均负载高了,不就意味着 CPU 使用率高吗? 我们还是要回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。 而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如: * CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的; * I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高; * 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。 平均负载案例分析 我们以三个示例分别来看这三种情况,并用 iostat、mpstat、pidstat 等工具,找出平均负载升高的根源。 测试准备工作 机器配置:2 CPU,8GB 内存。预先安装 stress 和 sysstat 包,如 apt install stress sysstat。 在这里,我先简单介绍一下 stress 和 sysstat。 * stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。 * 而 sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。我们的案例会用到这个包的两个命令 mpstat 和 pidstat。 * **mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。** * **pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。** **此外,每个场景都需要你开三个终端,登录到同一台 Linux 机器中。** 先安装stress sysstat [root@VM-64-25-centos ~]# yum -y install stress sysstat rpm update sysstat [root@VM-64-25-centos ~]# wget https://rpmfind. [Read More]