背景
前段时间,由于有几个应用引入了 prometheus-net.DotNetRuntime
这个组件,导致系统 CPU 间歇性飙升。这是这个组件一个已知的雷。。
同样也引发了系统的 Load Average (平均负载) 十分不正常。
这是一台 4C8G 的服务器,Load Average 却是达到了 15。这也是有点离谱!修复之后的是稳定在 4 以下的。
关于平均负载,其实里面的学问很多,只要候选人简历上提到过 Linux 相关的,老黄是一定会问 Load Average 相关的内容的。
所有也花点时间梳理一下吧。
查看平均负载的N种方式
w
12:02:29 up 25 days, 19:53, 1 user, load average: 1.28, 0.68, 0.49
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.10.2.219 12:02 1.00s 0.01s 0.00s w
top
Tasks: 142 total, 1 running, 141 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.7 us, 2.9 sy, 0.0 ni, 91.3 id, 0.0 wa, 0.3 hi, 0.8 si, 0.0 st
MiB Mem : 15604.6 total, 170.4 free, 1771.2 used, 13663.0 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 13522.4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 287467 root 20 0 22.1g 241512 20400 S 7.3 1.5 1029:52 dotnet287675 root 20 0 22.1g 233568 20616 S 7.3 1.5 1043:36 dotnet
uptime
12:04:08 up 25 days, 19:55, 1 user, load average: 0.58, 0.61, 0.49
上面的输出结果,都可以看到 load average 的字样,后面还带了三个数据。
load average: 0.58, 0.61, 0.49
三个数字怎么理解
既然提供了三个数字,那么这三个数字分别代表什么呢?
从左到右,依次是过去 1分钟、 5分钟、 15分钟,系统的平均负载。
通过这三个数字,就可以比较简单的判断系统的负载趋势,上升或下降。
举几个例子来看看。
例子一
1.30 0.90 0.55
这三个数字在告诉我们系统的负载在慢慢上升,运行效率可能会减慢。
因为三个数字依次降低,说明在过去的 1 分钟系统的负载比过去 15 分钟系统的负载大。
例子二
0.45 0.40 0.43
这三个数字在告诉我们系统的负载比较平稳,没有太大的波动。
因为这三个数字相差不大,比较接近。
例子三
0.45 0.70 1.43
这三个数字在告诉我们系统的负载在慢慢下降,运行效率可能会有所提高。
因为三个数字依次上升,说明在过去的 1 分钟系统的负载比过去 15 分钟系统的负载小。
上面的三个例子分析也只是能看出趋势,但是并不确定更加具体一点的信息。
下面看看单个数字的含义。
负载含义
拿 1.43
来说,它是什么意思呢?
如果是单核的机器,比如 1C1G,1C2G,说明系统已经在超负荷运作了,这一个 CPU 已经被完全占用了。
如果是多核的机器,比如 2C4G,4C8G,说明还有空闲的 CPU。
对于 2C 的来说,虽然没有满载,但也超过 70% 了,该留意一下了,因为很可能马上会出现问题。
对于 4C的来说,占用还没有 50%,基本可以不用太担心。
据说有一个经验值,CPU 数量的 0.7 !
当 Load Average 超过这个经验值的时候,就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。
总结
Load Average 提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。
要分析系统的负载情况,是离不开这三个不同时间间隔的平均值。