理解 AIX 上 sar 的输出

理解 AIX 上 sar 的输出

我正在尝试了解从 SAR 中提取的一些数据。我对此有三个主要问题。最终,我想确定服务器集群中每个采样间隔有多少个 CPU 处于空闲状态。

  1. 许多 CPU 并未出现在每个条目中。这是预期的吗?这到底意味着什么?与#2有关吗?
  2. 有未使用的线路(CPU = U)。这文档说“U表示系统范围内未使用的容量”。我真的找不到“系统范围内未使用的容量”的精确定义或任何定义。我不知道如何解释“未使用的容量有 70% 空闲”之类的内容。
  3. 最后,我不确定-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 ALLsar -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 核心已被禁用。

对您的问题的快速总结:

  1. 丢失数据可能意味着处理器核心被禁用。
  2. U平均行中的 与该U手册页中的 不同。手册页中引用的内容U应显示在处理器 ID 列下。
  3. 您提供的输出与标准输出不同sar,并且没有提供足够的信息来确定平均线上的U或所指的内容。all第一个数字似乎是活动核心上的空闲百分比。

相关内容