5.3. 被发布的资讯
系统核心透过 sys 虚拟档案系统(sysfs)将处理器cache的资讯发布在
/sys/devices/system/cpu/cpu*/cache
在 6.2.1 节,我们会看到能用来查询不同cache大小的介面。这里重要的是cache的拓朴。上面的目录包含了列出 CPU 拥有的不同cache资讯的子目录(叫做 index*)。档案 type、level、与 shared_cpu_map 是在这些目录中与拓朴有关的重要档案。一个 Intel Core 2 QX6700 的资讯看起来就如表 5.1。
type |
level |
shared_cpu_map |
||
|---|---|---|---|---|
cpu0 |
index0 |
Data | 1 | 00000001 |
index1 |
Instruction | 1 | 00000001 | |
index2 |
Unified | 2 | 00000003 | |
cpu1 |
index0 |
Data | 1 | 00000002 |
index1 |
Instruction | 1 | 00000002 | |
index2 |
Unified | 2 | 00000003 | |
cpu2 |
index0 |
Data | 1 | 00000004 |
index1 |
Instruction | 1 | 00000004 | |
index2 |
Unified | 2 | 0000000c | |
cpu3 |
index0 |
Data | 1 | 00000008 |
index1 |
Instruction | 1 | 00000008 | |
index2 |
Unified | 2 | 0000000c | |
sysfs 资讯这份资料的意义如下:
- 每颗处理器核25拥有三个cache:L1i、L1d、L2。
- L1d 与 L1i cache没有被任何其它的处理器核所共享 –– 每颗处理器核有它自己的一组cache。这是由
shared_cpu_map中的位元图(bitmap)只有一个被设置的位元所暗示的。 cpu0与cpu1的 L2 cache是共享的,正如cpu2与cpu3上的 L2 一样。
若是 CPU 有更多cache阶层,也会有更多的 index* 目录。
type |
level |
shared_cpu_map |
||
|---|---|---|---|---|
cpu0 |
index0 |
Data | 1 | 00000001 |
index1 |
Instruction | 1 | 00000001 | |
index2 |
Unified | 2 | 00000001 | |
cpu1 |
index0 |
Data | 1 | 00000002 |
index1 |
Instruction | 1 | 00000002 | |
index2 |
Unified | 2 | 00000002 | |
cpu2 |
index0 |
Data | 1 | 00000004 |
index1 |
Instruction | 1 | 00000004 | |
index2 |
Unified | 2 | 00000004 | |
cpu3 |
index0 |
Data | 1 | 00000008 |
index1 |
Instruction | 1 | 00000008 | |
index2 |
Unified | 2 | 00000008 | |
cpu4 |
index0 |
Data | 1 | 00000010 |
index1 |
Instruction | 1 | 00000010 | |
index2 |
Unified | 2 | 00000010 | |
cpu5 |
index0 |
Data | 1 | 00000020 |
index1 |
Instruction | 1 | 00000020 | |
index2 |
Unified | 2 | 00000020 | |
cpu6 |
index0 |
Data | 1 | 00000040 |
index1 |
Instruction | 1 | 00000040 | |
index2 |
Unified | 2 | 00000040 | |
cpu7 |
index0 |
Data | 1 | 00000080 |
index1 |
Instruction | 1 | 00000080 | |
index2 |
Unified | 2 | 00000080 | |
sysfs 资讯对于一个四槽、双核的 Opteron 机器,cache资讯看起来如表 5.2。可以看出这些处理器也有三种cache:L1i、L1d、L2。没有处理器核共享任何阶层的cache。这个系统有趣的部分在于处理器拓朴。少了这个额外资讯,就无法理解cache资料。sys 档案系统将这个资讯摆在下面这个档案
/sys/devices/system/cpu/cpu*/topology
表 5.3 显示了在 SMP Opteron 机器的这个阶层里头的令人感兴趣的档案。
physical_package_id |
core_id |
core_siblings |
thread_siblings |
|
|---|---|---|---|---|
cpu0 |
0 | 0 | 00000003 | 00000001 |
cpu1 |
1 | 00000003 | 00000002 | |
cpu2 |
1 | 0 | 0000000c | 00000004 |
cpu3 |
1 | 0000000c | 00000008 | |
cpu4 |
2 | 0 | 00000030 | 00000010 |
cpu5 |
1 | 00000030 | 00000020 | |
cpu6 |
3 | 0 | 000000c0 | 00000040 |
cpu7 |
1 | 000000c0 | 00000080 |
sysfs 资讯将表 5.2 与 5.3 摆在一起,我们能够发现
- 没有 CPU 拥有 HT (
thethread_siblings位元图有一个位元被设置)、 - 这个系统实际上共有四个处理器(
physical_package_id0 到 3)、 - 每个处理器有两颗核、以及
- 没有处理器核共享任何cache。
这正好与较早期的 Opteron 一致。
目前为止提供的资料中完全缺少的是,有关这台机器上的 NUMA 性质的资讯。任何 SMP Opteron 机器都是一台 NUMA 机器。为了这份资料,我们必须看看在 NUMA 机器上存在的 sys 档案系统的另一个部分,即下面的阶层中
/sys/devices/system/node
这个目录包含在系统上的每个 NUMA 节点的子目录。在特定节点的目录中有许多档案。在前两张表中描述的 Opteron 机器的重要档案与它们的内容显示在表 5.4。
cpumap |
distance |
|
|---|---|---|
node0 |
00000003 | 10 20 20 20 |
node0 |
0000000c | 20 10 20 20 |
node2 |
00000030 | 20 20 10 20 |
node3 |
000000c0 | 20 20 20 10 |
sysfs 资讯这个资讯将所有的一切连系在一起;现在我们有个机器架构的完整轮廓了。我们已经知道机器拥有四个处理器。每个处理器构成它自己的节点,能够从 node* 目录的 cpumap 档案中的值里头设置的位元看出来。在那些目录的 distance 档案包含一组值,一个值代表一个节点,表示在各个节点上存取memory的成本。在这个例子中,所有本地memory存取的成本为 10,所有对任何其它节点的远端存取的成本为 20。26这表示,即使处理器被组织成一个二维超立方体(见图 5.1),在没有直接连接的处理器之间存取也没有比较贵。成本的相对值应该能用来作为存取时间的实际差距的估计。所有这些资讯的准确性是另一个问题了。
25.cpu0到cpu3为处理器核的相关资讯来自于另一个将会简短介绍的地方。 ↩
26. 顺带一提,这是不正确的。这个 ACPI 资讯明显是错的,因为 –– 虽然用到的处理器拥有三条连贯的超传输连结 –– 至少一个处理器必须被连接到一个南桥上。至少一对节点必须因此有比较大的距离。 ↩