Linux
系统中,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。它不仅包括了正在使用CPU
的进程,也包括处于不可打断的睡眠状态的进程—它们是在等待其它系统资源如磁盘 I/O
等的进程。而CPU
使用率,是单位时间内CPU
繁忙情况的统计,跟平均负载并不一定完全对应。
有诸多方式监测系统平均负载,比如最常用的uptime
和top
工具:
uptime
命令
uptime
会显示系统运行时间、用户数量及平均负载:
$ uptime
20:53:21 up 2:19, 3 users, load average: 0.07, 0.02, 0.00
平均负载的数字从左到右的含义依次为:
- 最近 1 分钟的平均负载为 0.07
- 最近 5 分钟的平均负载为 0.02
- 最近 15 分钟的平均负载为 0.00
top
命令
top
命令可以实时的显示Linux
系统的运行状态:
$ top
下面是系统进程状态的显示:
top - 21:01:32 up 2:27, 2 users, load average: 0.03, 0.02, 0.00
Tasks: 261 total, 1 running, 190 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 1.5 sy, 0.0 ni, 97.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8144440 total, 5453688 free, 939500 used, 1751252 buff/cache
KiB Swap: 7810044 total, 7810044 free, 0 used. 6794636 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5834 f1dev 20 0 610168 107712 78048 S 1.7 1.3 0:04.87 chrome
2150 f1dev 20 0 1190912 116464 81708 S 1.0 1.4 0:14.88 compiz
5801 f1dev 20 0 771976 158536 113124 S 1.0 1.9 0:07.18 chrome
第一行的队列信息和uptime
命令的输出完全一致。
系统平均负载和CPU
核心数的关系
可以使用nproc
,lscpu
或者grep
命令查看系统中的处理器数量:
$ nproc
2
或者
$ lscpu
或者
$ grep 'model name' /proc/cpuinfo | wc -l
2
假设系统负载如下:
$ uptime
20:53:21 up 2:19, 3 users, load average: 1.00, 0.40, 3.35
如果一个单CPU
系统上表示在过去一分钟内系统刚好满载运行;在5分钟内CPU
有 60%处于空闲状态;而在15分钟内,有235%的超载。
如果是在一个双核系统中表示在过去一分钟内系统有一个CPU
处于完全空闲状态,另一个CPU
被使用;在5分钟内,CPU
平均160% 处于空闲状态;而在15分钟内,有135%的超载,也就是说最近的 15 分钟平均有1.35个进程等待CPU
时间。
平均负载案例分析
首先安装stress
和sysstat
工具:
# stress:一个Linux系统压力测试工具。
# sysstat:监控和分析系统的性能工具,包括mpstat(cpu详细信息)、pidstat(进程性能分析)命令、iostat等。
$ sudo apt install stress sysstat
同一个Linux
系统打开三个终端,在第一终端模拟CPU
使用率100%场景:
$ stress --cpu 1 --timeout 600
stress: info: [6684] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
第二个终端运行uptime
:
# -d 参数表示高亮显示变化的区域
$ watch -d uptime
21:40:12 up 3:06, 4 users, load average: 1.00, 0.50, 0.20
在第三个终端运行 mpstat
查看 CPU
使用率的变化:
# -P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
$ mpstat -P ALL 5
21时40分01秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
21时40分06秒 all 50.45 0.30 0.50 0.00 0.00 0.00 0.00 0.00 0.00 48.75
21时40分06秒 0 100.00 0.60 0.60 0.00 0.00 0.00 0.00 0.00 0.00 4.40
21时40分06秒 1 6.02 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 93.37
从终端二看到1分钟的平均负载会慢慢增加到1.00;终端三正好有一个CPU
使用率为100%,但它的iowait
只有0,说明平均负载的升高正是由于CPU
使用率的升高。
那么到底是哪个进程导致CPU
使用率为100%,可以使用top
命令来或使用pidstat
命令来查看:
# 间隔 5 秒后输出一组数据
$ pidstat -u 5 1
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 1000 6685 100.00 0.00 0.00 99.60 - stress
从这里可以明显看到,stress
进程的 CPU
使用率为 100%。