Linux 基础知识:CPU Usage 和 System Load 的关系


我们在《Linux 可观测性 - 你真的了解 Linux Load Average 吗?》中介绍了系统负载,总结如下:
系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。平均负载(Load Average)是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。
简单来说,Load Average 就是 CPU 的平均负载,它是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数。当 Load Average 值大于 CPU 核数时,就表示系统负载过重了。
那 System load 和 CPU 利用率有关系吗?
今天作者看到了良许 Linux 的文章:《如何正确理解 CPU 使用率和平均负载的关系?看完你就知道了》,其中有几张图很形象,可以供大家参考学习。
超线程(Hyper-Threading)技术可以让一个物理核在单位时间内同时处理两个线程,变成两个逻辑核。但它不会拥有传统单核 2 倍的处理能力,也不可能提供完整的并行处理能力。

如何查询 CPU 信息?
在 Linux 系统下,可以使用 lscpu 或者从 /proc/cpuinfo 文件中读取 CPU 信息。我们以 lscpu 为例:
lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 48 #系统有48个逻辑处理器(线程)。On-line CPU(s) list: 0-47 #所有在线的逻辑处理编号Thread(s) per core: 2 #表示每个物理核心有2个线程。这可能是通过超线程技术实现的,使每个核心可以同时处理两个线程。Core(s) per socket:    12 #表示每个CPU插槽有12个物理核心。Socket(s):             2 #两个CPU插槽,每个插槽中有一颗物理CPU。NUMA node(s): 2 #表示有两个非一致性内存访问(NUMA)节点。这表明系统中有两组处理器核心和内存,每组核心和内存之间有更快的本地访问,而跨组访问则较慢。Vendor ID: GenuineIntelCPU family: 6Model: 85Model name: Intel(R) Xeon(R) Silver 4214 CPU @ 2.20GHzStepping: 7CPU MHz: 2200.000CPU max MHz: 2200.0000CPU min MHz: 1000.0000BogoMIPS: 4400.00Virtualization: VT-xL1d cache: 32KL1i cache: 32KL2 cache: 1024KL3 cache: 16896KNUMA node0 CPU(s): 0-11,24-35NUMA node1 CPU(s): 12-23,36-47Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single intel_ppin ssbd mba rsb_ctxsw ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm arat pln pts pku ospke avx512_vnni md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
通过 cpuinfo 查询
#查看 CPU 个数:cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l#查看 CPU 物理核数:cat /proc/cpuinfo | grep 'cpu cores' | sort | uniq#查看 CPU 逻辑核数:cat /proc/cpuinfo | grep 'siblings' | sort | uniq

CPU 负载和 CPU 核的关系

虽然上述的解释看起来很简单,但是实际上却不能很好解释 Linux Load Average 的真正含义。
对于将 CPU 负载划分为不同的区间,以反映系统的繁忙程度,我们通常可以使用以下一般性的划分方案(笔者一般经验,大家可以根据真实场景做调整):
绿色(系统正常):0.0 - 0.7
当 CPU 负载在这个范围内时,系统的负载相对较低,系统资源充足,可以轻松处理当前的工作负载,响应时间较短。
黄色(系统繁忙):0.7 - 0.9
当 CPU 负载在这个范围内时,系统的负载逐渐增加,系统资源开始紧张,可能会出现一些轻微的性能下降,响应时间略有延迟。
红色(系统过于繁忙):0.9 - 1.0
当 CPU 负载在这个范围内时,系统的负载非常高,系统资源极度紧张,可能会导致明显的性能下降和延迟,甚至影响系统的稳定性。
此外也推荐一下 ssar (SRE Sar)工具,有一个独创的 load5s 指标:此值为 ssar 独家指标,反应的是当前时刻系统真实的 load 压力大小,比 load1 更准确。

ssar 工具特异指标 load5s 深入说明
从字面意思来说,很多资料解释 load1 就是 1 分钟的 load 均值,很多资料解释 load5 就是 5分钟的load均值,很多资料解释load15就是15分钟的 load 均值。那么 load5s 按此逻辑理解,可以初步解释为 5 秒钟的 load 均值。
了解内核的同学都知道内核里的 active 值,这个 load5s 就是 active 值。所以,load5s 的准确理解是每隔 5 秒左右的一个 R 和 D 状态线程数的刻度值。
不了解内核的同学可以通过下面这个比喻来理解。load5s 就是油门大小,load1就是车速。真正对操作系统产生压力的不是车速(load1)大小,是油门(load5s)大小。在车速(load1)很低情况下,即使加一个很大的油门(load5s),车速(load1)也要经过一点时间才能提速,不会瞬间切变。这里说明即使车速(load1)不是特别高,并不代表此时此刻油门(load5s)不大。在车速(load1)较高的情况下,如果没有油门(load5s)了,车速(load1)会缓慢下降。这里说明即使车速(load1)依然很高,但油门(load5s)可能已经没有了。要保持一个较高的车速(load1),就需要不断给一个恰当油门(load5s)。
最后说一下 ssar load5s 没有显示 load5 和 load15 这 2 个指标。上面说了 active 值(即load5s)是一个刻度值,只能反映那 5 秒钟的机器压力情况。历史上,linux 通 过load1、load5 和 load15 来把过去若干分钟内的 active 值通过适当的加权后,在当前时刻展示出来。可是一旦有了各种 sar 工具之后,我们就已经记录了过去各个时间点的 load1、load5 和 load15 值了,至少我们已经不用在通过 load5 和 load15 来观察 5 分钟或 15 分钟前的情况了,因为 load1的历史数据都已经更加清晰的表达了。如今有了 load5s 值之后,就更没有 load5 和 load15 存在的必要性了。
有兴趣的童鞋可以查看:https://gitee.com/anolis/ssar。
CPU 使用率与平均负载的关系
CPU 使用率是单位时间内 CPU 繁忙程度的统计。而平均负载不仅包括正在使用 CPU 的进程,还包括等待 CPU 或 I/O 的进程。因此,两者不能等同,有两种常见的场景如下所述:
CPU 密集型应用,大量进程在等待或使用 CPU,此时 CPU 使用率与平均负载呈正相关状态。
I/O 密集型应用,大量进程在等待 I/O,此时平均负载会升高,但 CPU 使用率不一定很高。
为了更深入的理解 CPU 使用率与平均负载的关系,我们举一个例子:假设现在有一个电话亭,有 4 个人在等待打电话,电话亭同一时刻只能容纳 1 个人打电话,只有拿起电话筒才算是真正使用。
那么 CPU 使用率就是拿起电话筒的时间占比,它只取决于在电话亭里的人的行为,与平均负载没有非常直接的关系。而平均负载是指在电话亭里的人加上排队的总人数,如下图所示:

到顶部