5.3. 被發布的資訊
系統核心透過 sys
虛擬檔案系統(sysfs)將處理器快取的資訊發布在
/sys/devices/system/cpu/cpu*/cache
在 6.2.1 節,我們會看到能用來查詢不同快取大小的介面。這裡重要的是快取的拓樸。上面的目錄包含了列出 CPU 擁有的不同快取資訊的子目錄(叫做 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擁有三個快取:L1i、L1d、L2。
- L1d 與 L1i 快取沒有被任何其它的核心所共享––每顆核心有它自己的一組快取。這是由
shared_cpu_map
中的位元圖(bitmap)只有一個被設置的位元所暗示的。 cpu0
與cpu1
的 L2 快取是共享的,正如cpu2
與cpu3
上的 L2 一樣。
若是 CPU 有更多快取階層,也會有更多的 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 機器,快取資訊看起來如表 5.2。可以看出這些處理器也有三種快取:L1i、L1d、L2。沒有核心共享任何階層的快取。這個系統有趣的部分在於處理器拓樸。少了這個額外資訊,就無法理解快取資料。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 擁有超執行緒(
thethread_siblings
位元圖有一個位元被設置)、 - 這個系統實際上共有四個處理器(
physical_package_id
0 到 3)、 - 每個處理器有兩顆核心、以及
- 沒有核心共享任何快取。
這正好與較早期的 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
檔案包含一組值,一個值代表一個節點,表示在各個節點上存取記憶體的成本。在這個例子中,所有本地記憶體存取的成本為 10,所有對任何其它節點的遠端存取的成本為 20。26這表示,即使處理器被組織成一個二維超立方體(見圖 5.1),在沒有直接連接的處理器之間存取也沒有比較貴。成本的相對值應該能用來作為存取時間的實際差距的估計。所有這些資訊的準確性是另一個問題了。
25.cpu0
到cpu3
為核心的知識來自於另一個將會簡短介紹的地方。 ↩
26. 順帶一提,這是不正確的。這個 ACPI 資訊明顯是錯的,因為––雖然用到的處理器擁有三條連貫的超傳輸連結––至少一個處理器必須被連接到一個南橋上。至少一對節點必須因此有比較大的距離。 ↩