观察性能指标“平均负载”

发现系统变慢时,我们可以通过 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% 的时候,就应该分析排查负载高的原因。
Redis对象(四) Set