系统的平均负载是指单位时间内,系统处于可运行状态和不可中断状态的进程数
可运行状态进程:可以理解为系统内正在占用CPU或正在等待CPU的进程,也就是处于R状态的进程
不可中断的进程:一般表示正处于内核关键流程的进程,不可被中断,最常见的如等待磁盘IO的进程,也就是系统内常见的D进程(disk sleep),不可中断是因为此时正在读写磁盘IO,中断会导致进程内数据与磁盘内数据产生差异(等待IO并不占用CPU的使用率,因此平均负载高并不表示CPU使用率高,有可能CPU使用率并不高,而是等待IO)
1个CPU在同一时间只能执行一个进程的代码(多个进程同时运行是利用了CPU的时间分片机制,会产生上下文切换,损耗CPU性能),实际上CPU同一时间只能运行1个进程
比如:服务器上有2核心的CPU,通过 uptime 查看发现1分钟内平均负载为1,表示1分钟内有1个核心的CPU是一直处于工作状态或不可中断状态,同时另外1个核心的CPU是空闲的,2核心的CPU平均负载达到2,表示CPU工作饱和,此时如果再增加进程运行,会出现等待CPU的现象(通过 pidstat 查看时会看到进程的 %wait 值增加,表示进程等待CPU的时间)
实践:
利用 stress 压测工具验证可运行状态进程,不可中断进程状态时的现象 ubuntu 18.04机型 双核心CPU
1. 安装stress,sysstat工具 (会用到sysstat包的 mpstat,pidstat 工具)
apt-get install stress sysstat -y
2. 使用uptime查看当前CPU平均负载,并使用stress 压测CPU,等待1分钟再次查询平均负载对比
root@cloud-public:~# uptime #第一次查询,可以看到1分钟平均负载 0.03 非常低
00:10:39 up 37 days, 13:36, 1 user, load average: 0.03, 0.03, 0.00
root@cloud-public:~# stress --cpu 1 --timeout 100 #使用stress工具压测1核心的CPU
stress: info: [12503] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
root@cloud-public:~# uptime # 第二次查询,发现平均负载变为 1.05 ,表示有1个核心的CPU 1分钟内处于运行状态
00:13:32 up 37 days, 13:39, 2 users, load average: 1.05, 0.49, 0.19
root@cloud-public:~# mpstat -P ALL 3 # 使用 mpstat 工具查看所有CPU的使用情况,可以看到有1个CPU使用率为100%
Linux 4.15.0-142-generic (cloud-public) 12/10/2021 _x86_64_ (2 CPU)
12:15:36 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
12:15:39 AM all 50.25 0.00 0.17 0.17 0.00 0.00 0.00 0.00 0.00 49.42
12:15:39 AM 0 0.33 0.00 0.67 0.33 0.00 0.00 0.00 0.00 0.00 98.67
12:15:39 AM 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
root@cloud-public:~# pidstat -u 5 1 # 通过pidstat 查询进程,可以看到 stress 进程CPU使用率为100%
Linux 4.15.0-142-generic (cloud-public) 12/10/2021 _x86_64_ (2 CPU)
12:19:40 AM UID PID %usr %system %guest %wait %CPU CPU Command
12:19:45 AM 0 1139 0.20 0.20 0.00 0.00 0.40 1 sunloginclient
12:19:45 AM 0 2341 0.20 0.00 0.00 0.00 0.20 1 barad_agent
12:19:45 AM 0 6034 0.20 0.00 0.00 0.00 0.20 1 tat_agent
12:19:45 AM 0 14426 100.00 0.00 0.00 0.00 100.00 0 stress
12:19:45 AM 0 14470 0.00 0.20 0.00 0.00 0.20 1 pidstat
IO占用型场景的测试:
stress -i 1 --timeout 600 #占用一个100%CPU,使用 mpstat工具查看时会看到CPU时间消耗在sys,iowait上
大量进程CPU占用场景测试:
stress -c 8 --timeout 600 #并发8个CPU的进程占用,会发现平均负载为8,但是机器实际CPU为2核心
因此,通过pidstat 工具查看进程占用CPU时,会发现 %wait 升高,表示进程等待CPU的时间
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。