平均负载 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 |