发现系统变慢时,我们可以通过 top 或 uptime 命令,了解系统负载情况,如下。
shell
$ watch -d uptime
02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88
Watch -d 可以高亮显示变化的值,输出值含义如下。
02:34:03 // 当前系统时间
up 2 days, 20:14 // 系统运行时间
1 user // 正在登陆用户数
load average: 0.63, 0.83, 0.88 // 过去 1分钟、5分钟、15分钟的平均负载
前面 3 个输出值很好理解,重点解释,什么是平均负载。平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数。
- 可运行状态进程:处于运行队列中的进程,使用 ps 命令,看到处于 R (Running 或 Runnable)状态的进程,正在等待 CPU 资源
- 不可中断状态进程:处于等待 I/O 操作完成的进程,例如磁盘读写操作,使用 ps 命令,看到处于 D (Disk Sleep)状态的进程 平均进程数的平均,是一个统计学意义上的平均值,统计方法为 EWMA 加权移动平均,这里不展开介绍。 平均负载的值,最理想的情况是每个 CPU 上都刚好运行了一个进程,例如平均负载为 2。
- 2 个 CPU 的系统上,意味着所有 CPU 都刚好被占用,理想状态
- 4 个 CPU 的系统上,意味着 CPU 有 50% 处于空闲状态
- 1 个 CPU 的系统上,意味着有一半的进程竞争不到 CPU
shell
$ grep 'model name' /proc/cpuinfo | wc -l // 获取 CPU 核数
CPU 使用率和平均负载不能划上等号。例如 I/O 密集型进程,等待 I/O 会导致平均负载很高,但 CPU 使用率不一定很高。 在 ubuntu 上,可以通过 sysstat 监控和分析系统的性能。
$ apt install sysstat
如果是普通用户登录,先切换到 root 用户。
$ sudo su root
Sysstat 包的 mpstat 和 pidstat 命令,可以用来分析每个 CPU 的性能指标和进程的 CPU、内存、I/O 等性能指标。下面列举几个使用场景。
- CPU 密集型进程
shell
# -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
$ mpstat -P ALL 5
shell
# 间隔5秒后输出一组数据
$ pidstat -u 5 1
13:37:07 UID PID %usr %system %guest %wait %CPU CPU Command
13:37:12 0 2962 100.00 0.00 0.00 0.00 100.00 1 stress
- I/O 密集型进程
shell
# 显示所有CPU的指标,并在间隔5秒输出一组数据
$ mpstat -P ALL 5 1
- 大量进程的场景
shell
# 间隔5秒后输出一组数据
$ pidstat -u 5 1
小结如下。
- 平均负载一定要结合 CPU 核数来观察。
- CPU 使用率和平均负载不能划上等号。
- 1、5、15 分钟的值,可以分析出平均负载的变化趋势。
- 平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的原因。