【Linux】之 平均负载(排查实战)
原创
©著作权归作者所有:来自51CTO博客作者DonaldY的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
一、简介
系统变慢时,执行 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)什么是平均负载?
- 平均负载:
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
- 平均负载,其实就是平均活跃进程数
- 平均负载,是指单位时间内,处于可运行状态 和 不可中断状态 的 进程数
(即,正在使用 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 密集型进程
- 模拟一个 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
- 运行
uptime
查看平均负载的变化情况:
watch -d uptime
- 查看 CPU 使用率的变化情况:
mpstat -P ALL 5
- 查询哪个进程:
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 密集型进程
- 模拟 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
- 查看平均负载的变化情况:
watch -d uptime
- 运行
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
- 查看哪个进程,导致
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 的进程:
- 模拟8个进程:
stress -c 8 --timeout 600
$ stress -c 8 --timeout 600
stress: info: [25815] dispatching hogs: 8 cpu, 0 io, 0 vm, 0 hdd
- 查看平均负载的变化情况:
uptime
$ uptime
11:58:46 up 1:01, 4 users, load average: 1.77, 0.45, 0.27
-
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