我正在尝试了解从 SAR 中提取的一些数据。我对此有三个主要问题。最终,我想确定服务器集群中每个采样间隔有多少个 CPU 处于空闲状态。
- 许多 CPU 并未出现在每个条目中。这是预期的吗?这到底意味着什么?与#2有关吗?
- 有未使用的线路(CPU = U)。这文档说“U表示系统范围内未使用的容量”。我真的找不到“系统范围内未使用的容量”的精确定义或任何定义。我不知道如何解释“未使用的容量有 70% 空闲”之类的内容。
- 最后,我不确定
-
orall
线是如何计算的。我认为这是所有 CPU 的平均值,但是当我对所有 CPU 进行数学计算时,我得到的答案与该行的答案截然不同。谁能准确地告诉我这个计算的内容是什么?仔细看看这个关于SAR的相关问题看来system-wide
空闲百分比是每个 CPU 的空闲百分比与“physc”值的乘积之和。不幸的是,我没有physc
或 entc% (假设有),所以我无法用我自己的数据验证这一点。如果这是正确的,是否意味着我需要这些physc
值才能真正了解空闲百分比?
以下是我所看到的一些示例。这些都是同一天的。
CPU | Idle CPU | Idle CPU | Idle
---------- ---------- ----------
0 | 8 0 | 15 0 | 17
1 | 25 1 | 94 1 | 32
2 | 79 2 | 100 2 | 97
3 | 62 3 | 99 3 | 71
4 | 5 4 | 13 4 | 5
5 | 7 5 | 13 5 | 23
6 | 6 6 | 99 6 | 71
7 | 7 7 | 44 7 | 98
8 | 11 8 | 12 8 | 48
9 | 17 12 | 0 12 | 38
10 | 33 16 | 12 16 | 37
11 | 64 20 | 3 20 | 42
12 | 6 U | 95 U | 97
13 | 6 - | 15 - | 85
14 | 6
15 | 6
16 | 12
17 | 15
18 | 62
19 | 69
20 | 7
21 | 7
22 | 6
23 | 7
U | 80
- | 15
case 1: avg(24): 22
case 2: avg(12): 42
case 3: avg(12): 48
该数据由运行的脚本生成:sar -P ALL 1 1
然后运行 awk 命令。我不擅长 awk,但这些显然是重要的部分:
筛选:/System|AIX|^$|%/ {next}
解析:{k=0;if(NR==7) k=1} {sub("^-", "all", $1); cpu=$(1+k); user=$(2+k); sys=$(3+k); io=$(4+k); idle=$(5+k)}
根据我对 awk 的了解以及我从输出示例中看到的内容,这似乎是正确的。
如果我假设情况 2 的缺失值全部为零,则平均值为 21,这似乎与情况 1 有点一致。但是,如果我对情况 3 做出这样的假设,我得到 24%,这与 85% 完全不一致sar 给出的总体 CPU 空闲百分比值。
以下是全天捕获量的图表(每 30 秒):
当“系统范围”空闲时间非常少时,平均 CPU 空闲时间和“系统范围”空闲时间之间的相关性几乎是完美的。但随着“系统范围”空闲时间的增加,相关性变得更弱。假设这些是确定性机器,这告诉我,我所拥有的数据并没有给出完整的情况。但我有多在乎呢?
我不完全理解为什么有些 CPU 没有在每个点都被报告,但缺少的 CPU 分布并不均匀,如上面的示例所示。也从阅读这篇文章红色的书,我认为这些必须是逻辑 CPU,如果没有数字physc
,我认为我对这些值无能为力。我尝试U
在各种方程中使用该值,但没有发现任何合理的东西。我什至不清楚整体闲置百分比是否可以按面值计算。
笔记:从 sar 捕获此数据有问题,这是 #1 的完全有效答案,如果是这种情况,它应该始终返回。
答案1
您提供的输出看起来与标准sar -P ALL
或sar -u
输出不同。我不确定您是否手动格式化了它,或者您是否通过其他工具运行它,但我认为那里有足够的信息来解决这个问题。
这是从手册页中获得的重要信息sar
注意:在 SMP 机器上,根本没有任何活动(每个字段为 0.00)的处理器是禁用(脱机)处理器。
由于您在集群中运行,因此假设您使用的是 SMP 机器似乎相当安全。
请注意,在示例 2 和 3 中,24 个内核中只有 12 个正在报告统计信息。如果您假设这些核心已禁用(如手册页中所述),则统计信息是有意义的。
让我们按如下方式更新您的数据,以指示禁用的核心-
0 | 8 0 | 15 0 | 17
1 | 25 1 | 94 1 | 32
2 | 79 2 | 100 2 | 97
3 | 62 3 | 99 3 | 71
4 | 5 4 | 13 4 | 5
5 | 7 5 | 13 5 | 23
6 | 6 6 | 99 6 | 71
7 | 7 7 | 44 7 | 98
8 | 11 8 | 12 8 | 48
9 | 17 9 | - 9 | -
10 | 33 10 | - 10 | -
11 | 64 11 | - 11 | -
12 | 6 12 | 0 12 | 38
13 | 6 13 | - 13 | -
14 | 6 14 | - 14 | -
15 | 6 15 | - 15 | -
16 | 12 16 | 12 16 | 37
17 | 15 17 | - 17 | -
18 | 62 18 | - 18 | -
19 | 69 19 | - 19 | -
20 | 7 20 | 3 20 | 42
21 | 7 21 | - 21 | -
22 | 6 22 | - 22 | -
23 | 7 23 | - 23 | -
然后我们可以使用以下内容来计算平均值(这是我写的快速单行代码,我确信可以写出更好的东西。)
$ awk '{idle = $3; output += idle; if (idle >= 0) {cores += 1} } END {printf "Ave idle%%: %f Cores: %d\n", output / cores, cores }' input_file
Ave idle%: 22.208333 Cores: 24
$ awk '{idle = $6; output += idle; if (idle >= 0) {cores += 1} } END {printf "Ave idle%%: %f Cores: %d\n", output / cores, cores }' input_file
Ave idle%: 42.000000 Cores: 12
$ awk '{idle = $9; output += idle; if (idle >= 0) {cores += 1} } END {printf "Ave idle%%: %f Cores: %d\n", output / cores, cores }' input_file
Ave idle%: 48.250000 Cores: 12
请注意,示例 2 和 3 中的核心数量为 12,平均值与您在示例输出中看到的相符。
看起来在第一种情况和第二种情况之间的某个时刻,一半的 CPU 核心已被禁用。
对您的问题的快速总结:
- 丢失数据可能意味着处理器核心被禁用。
U
平均行中的 与该U
手册页中的 不同。手册页中引用的内容U
应显示在处理器 ID 列下。- 您提供的输出与标准输出不同
sar
,并且没有提供足够的信息来确定平均线上的U
或所指的内容。all
第一个数字似乎是活动核心上的空闲百分比。