平均负载 load averages
很多文章介绍负载拿高速公路、银行取号、餐厅取餐等场景举例,有的确实能让人融会贯通,有的让刚接触的人更迷糊
其实要想很好的理解负载,看man uptime
足够了
uptime
先来看下执行uptime
命令的输出
1 | localhost ~ # uptime |
- 11:35:22 当前时间
- up 28 days, 21:51 系统运行(启动)时间
- 4 users 当前系统登录用户数
- load average: 2.64 2.83 2.73,其中2.64 2.83 2.73 分别代表过去1、5、15分钟的系统平均负载
平均负载
系统的平均负载其实就是单位时间内可运行(runnable)和不可中断(uninterruptable)的进程数量之和
- 可运行(runnable)进程指的是正在使用CPU或等待使用CPU的进程
对应man ps
中PROCESS STATE CODES
列出的进程状态R
- running or runnable (on run queue) - 不可中断(uninterruptable)的进程指的是处于关键流程中的状态,比如I/O响应:进程向硬盘读写数据的时候,为了数据一致性,此时不能被打断
对应man ps
中PROCESS STATE CODES
列出的进程状态D
- uninterruptible sleep (usually IO)
理想情况下,负载数等于CPU核数(逻辑核),基于负载数和CPU核数来判断当前的过载情况,如果当前负载为1
- 在1核CPU上,刚好完全使用
- 在2核CPU上,CPU 50% 使用,50% 空闲
- 在4核CPU上,CPU 25% 使用,75% 空闲
高负载场景
- I/O密集型:最常见于CPU使用率不高,负载较高的场景
- CPU/计算密集型
- 大量进程,其数量远超过CPU逻辑核心数
可以通过stress
工具压测,atop
等工具进行性能监控,这样比较有直观感受;尤其是可以对比下不同场景下具体的性能指标体现
I/O密集型
压测命令
1 | stress -i `nproc` --timeout 300 |
动态查看负载情况
1 | watch -d uptime |
atop查看整体性能情况: 可以看到DSK
行变红,出现性能瓶颈
1 | atop |
或者mpstat: 可以看到%iowait
列的值变大
1 | mpstat -P ALL 2 5 |
CPU/计算密集型
压测命令
1 | stress -c `nproc` --timeout 300 |
动态查看负载情况
1 | watch -d uptime |
atop查看整体性能情况: 可以看到所有cpu
相关行变红,出现性能瓶颈
1 | atop |
或者mpstat: 可以看到%usr
列的值几乎都是100%
1 | mpstat -P ALL 2 5 |
大量进程
压测命令
1 | stress -c $((`nproc`<<2)) --timeout 300 |
动态查看负载情况
1 | watch -d uptime |
atop查看整体性能情况: 可以看到所有cpu
相关行变红,单进程占用CPU使用率不高
1 | atop |
或者pidstat: 可以看到%wait
列的值大于或等于%usr
(取决具体压测参数); 此时mpstat
不能直观看出问题,也表现为%usr
的值几乎都是100%
1 | pidstat -u 5 1 |