在排查性能问题的时候,我们经常会使用 top 或者 uptime 两个 Linux 命令,top 命令和 uptime 命令都会给出最近机器 1 min,5 min,15 min 的平均负载情况,一般平均负载值(Average Load)接近甚至超出 CPU cores (现在一般指 processors 的个数, 现在 CPU 的一个 core 一般有两个 processor, 可以处理两个进程) 时,系统会有性能瓶颈.
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程.
造成平均负载升高的原因一般有以下几种:
- 1、有 IO Bound 进程(即存在 IO 密集型任务)
- 2、有 CPU Bound 进程(即存在 CPU 密集型任务)
- 3、处于就绪状态(Ready)的进程多
- …..
本篇文章主要记录下造成平均负载升高的两个场景. IO 密集型场景和 CPU 密集型场景.
这里的实验环境在一个操作系统为 Ubuntu 20.04.3 LTS 的容器内, 通过 stress 进行 IO Bound 与 CPU Bound 场景的模拟, 宿主机有 16 个 processors, 8G 运行内存.
代码语言:javascript复制docker run --rm -it ubuntu:latest
root@bfdbc798879c:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
代码语言:javascript复制root@bfdbc798879c:/# top
top - 11:21:53 up 3:10, 0 users, load average: 0.66, 0.79, 0.46
Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.0 us, 0.6 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.0 hi, 5.1 si, 0.0 st
%Cpu1 : 10.2 us, 0.3 sy, 0.0 ni, 88.1 id, 0.0 wa, 0.0 hi, 1.3 si, 0.0 st
%Cpu2 : 10.4 us, 2.7 sy, 0.0 ni, 87.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu4 : 11.1 us, 0.7 sy, 0.0 ni, 88.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 : 0.7 us, 1.3 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu7 : 3.0 us, 0.0 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu8 : 0.3 us, 1.0 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu9 : 0.7 us, 0.0 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu10 : 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu11 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu12 : 0.3 us, 0.3 sy, 0.0 ni, 99.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu13 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu14 : 10.7 us, 0.7 sy, 0.0 ni, 88.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu15 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7829.4 total, 1913.4 free, 1582.2 used, 4333.7 buff/cache
MiB Swap: 2048.0 total, 2047.7 free, 0.3 used. 5582.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND
1 root 20 0 4232 3504 2952 S 0.0 0.0 0:00.02 bash
12 root 20 0 6092 3332 2828 R 0.0 0.0 0:00.08 top
root@bfdbc798879c:/# free -mh
total used free shared buff/cache available
Mem: 7.6Gi 1.6Gi 1.8Gi 410Mi 4.3Gi 5.4Gi
Swap: 2.0Gi 0.0Ki 2.0Gi
让我们先安装一下 stress 压力测试工具和系统观测要用到的工具.
代码语言:javascript复制apt-get update
apt-get install -y stress sysstat
CPU Bound 场景
这里我们让三个逻辑 CPU 满载:
代码语言:javascript复制# 持续 10 min, 3 CPU 满载
stress -c 3 -t 600
我们用 watch 命令持续观察平均负载情况, 平均负载在逐渐变高,此时我的电脑 CPU 风扇也很响了