文章目录




一、简介


系统变慢时,执行 ​​top​​​ 或 ​​uptime​​命令,来了解系统的负载情况

$ uptime
23:11:16 up 9 min, 1 user, load average: 0.38, 0.47, 0.30


# 23:11:16 // 当前时间
# up 9 min // 系统运行时间
# 1 user // 正在登录用户数
# load average // 过去 1分钟、5分钟、15分钟的平均负载



(1)什么是平均负载?

  1. 平均负载:

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

  1. 平均负载,其实就是平均活跃进程数
  2. 平均负载,是指单位时间内,处于可运行状态不可中断状态进程数
    (即,正在使用 CPU 的进程、等待 CPU 和 等待 I/O 的进程)
$ grep 'model name' /proc/cpuinfo | wc -l
8

# 说明有 8个 cpu

# 查看 CPU 详细信息



(2)平均负载会导致什么结果?

当平均负载高于 CPU 数量 70% 的时候,你就应该分析排查负载高的问题了
一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能



(3)什么会导致平均负载增高?

CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应

比如:

  • CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
  • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
  • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。



二、实战


使用 ​​iostat​​​、​​mpstat​​​、​​pidstat​​工具。

环境:Ubuntu 18
CPU : 1
内存:1G



(1)CPU 密集型进程

  1. 模拟一个 CPU 使用率 100%的场景:
    ​​​stress --cpu 1 --timeout 600​
$ stress --cpu 1 --timeout 600
stress: info: [24930] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd



  1. 运行​​uptime​​​ 查看平均负载的变化情况:
    ​​​watch -d uptime​


  1. 查看 CPU 使用率的变化情况:
    ​​​mpstat -P ALL 5​


  1. 查询哪个进程:
    ​​​pidstat -u 5 1​
$ pidstat -u 5 1
Linux 4.4.0-131-generic (ubuntu) 01/19/2020 _x86_64_ (1 CPU)

11:30:49 AM UID PID %usr %system %guest %CPU CPU Command
11:30:54 AM 0 7 0.78 0.00 0.00 0.78 0 rcu_sched
11:30:54 AM 1000 24931 386.82 0.00 0.00 386.82 0 stress
11:30:54 AM 1000 24934 0.78 0.00 0.00 0.78 0 watch

Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 7 0.78 0.00 0.00 0.78 - rcu_sched
Average: 1000 24931 386.82 0.00 0.00 386.82 - stress
Average: 1000 24934 0.78 0.00 0.00 0.78 - watch



(2)I/O 密集型进程

  1. 模拟 I/O 压力,不停地执行​​sync​​​:
    ​​​stress -i 1 --timeout 600​
$ stress -i 1 --timeout 600
stress: info: [25125] dispatching hogs: 0 cpu, 1 io, 0 vm, 0 hdd



  1. 查看平均负载的变化情况:
    ​​​watch -d uptime​


  1. 运行​​mpstat​​​ 查看 CPU 使用率的变化情况:
    ​​​mpstat -P ALL 5 1​
mpstat -P ALL 5 1
Linux 4.4.0-131-generic (ubuntu) 01/19/2020 _x86_64_ (1 CPU)

11:34:05 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:34:10 AM all 0.00 0.00 22.93 0.00 0.00 0.64 0.00 0.00 0.00 76.43
11:34:10 AM 0 0.00 0.00 22.93 0.00 0.00 0.64 0.00 0.00 0.00 76.43

Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 0.00 0.00 22.93 0.00 0.00 0.64 0.00 0.00 0.00 76.43
Average: 0 0.00 0.00 22.93 0.00 0.00 0.64 0.00 0.00 0.00 76.43



  1. 查看哪个进程,导致​​iowait​​​ 飘高,用​​pidstat​​​来查询:
    ​​​pidstat -u 5 1​
pidstat -u 5 1
Linux 4.4.0-131-generic (ubuntu) 01/19/2020 _x86_64_ (1 CPU)

11:34:25 AM UID PID %usr %system %guest %CPU CPU Command
11:34:30 AM 0 141 0.00 3.18 0.00 3.18 0 kworker/0:1H
11:34:30 AM 1000 25126 0.00 225.48 0.00 225.48 0 stress

Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 141 0.00 3.18 0.00 3.18 - kworker/0:1H
Average: 1000 25126 0.00 225.48 0.00 225.48 - stress



(3)大量进程的场景

当系统中运行进程超出 CPU 运行能力时,就会出现等待 CPU 的进程:

  1. 模拟8个进程:
    ​​​stress -c 8 --timeout 600​
$ stress -c 8 --timeout 600
stress: info: [25815] dispatching hogs: 8 cpu, 0 io, 0 vm, 0 hdd



  1. 查看平均负载的变化情况:
    ​​​uptime​
$ uptime
11:58:46 up 1:01, 4 users, load average: 1.77, 0.45, 0.27



  1. ​pidstat​​​ 查看一下进程的情况:
    ​​​pidstat -u 5 1​
$ pidstat -u 5 1
Linux 4.4.0-131-generic (ubuntu) 01/19/2020 _x86_64_ (1 CPU)

11:59:03 AM UID PID %usr %system %guest %CPU CPU Command
11:59:08 AM 0 1033 0.76 0.00 0.00 0.76 0 iscsid
11:59:08 AM 0 24613 0.00 0.76 0.00 0.76 0 kworker/0:2
11:59:08 AM 1000 25816 47.73 0.00 0.00 47.73 0 stress
11:59:08 AM 1000 25817 46.97 0.00 0.00 46.97 0 stress
11:59:08 AM 1000 25818 46.97 0.00 0.00 46.97 0 stress
11:59:08 AM 1000 25819 47.73 0.00 0.00 47.73 0 stress
11:59:08 AM 1000 25820 47.73 0.00 0.00 47.73 0 stress
11:59:08 AM 1000 25821 46.97 0.00 0.00 46.97 0 stress
11:59:08 AM 1000 25822 48.48 0.00 0.00 48.48 0 stress
11:59:08 AM 1000 25823 46.97 0.00 0.00 46.97 0 stress

Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 1033 0.76 0.00 0.00 0.76 - iscsid
Average: 0 24613 0.00 0.76 0.00 0.76 - kworker/0:2
Average: 1000 25816 47.73 0.00 0.00 47.73 - stress
Average: 1000 25817 46.97 0.00 0.00 46.97 - stress
Average: 1000 25818 46.97 0.00 0.00 46.97 - stress
Average: 1000 25819 47.73 0.00 0.00 47.73 - stress
Average: 1000 25820 47.73 0.00 0.00 47.73 - stress
Average: 1000 25821 46.97 0.00 0.00 46.97 - stress
Average: 1000 25822 48.48 0.00 0.00 48.48 - stress
Average: 1000 25823 46.97 0.00 0.00 46.97 - stress