29.4. 針對 CPU 集的偽 NUMA¶
- 作者:
David Rientjes <rientjes@cs.washington.edu>
使用 numa=fake 和 CPU 集進行資源管理
本文件描述瞭如何將 numa=fake x86_64 命令列選項與 CPU 集結合使用以進行粗粒度記憶體管理。使用此功能,您可以建立代表連續記憶體塊的偽 NUMA 節點,並將它們分配給 CPU 集及其附加的任務。這是一種限制特定型別的任務可用的系統記憶體量的方法。
有關 CPU 集功能的更多資訊,請參見CPU 集。您可以根據需要使用許多不同的配置。有關 numa=fake 命令列選項及其配置偽節點的各種方法的更多資訊,請參見核心的命令列引數
為了介紹的目的,我們將假設一個非常原始的 NUMA 模擬設定 “numa=fake=4*512,”。這將把我們的系統記憶體分成四個相等的 512M 塊,我們現在可以使用這些塊分配給 CPU 集。隨著您越來越熟悉使用這種組合進行資源控制,您將確定一個更好的設定,以最大程度地減少必須處理的節點數量。
使用 “numa=fake=4*512,” 可以如下分割機器,如 dmesg 報告
Faking node 0 at 0000000000000000-0000000020000000 (512MB)
Faking node 1 at 0000000020000000-0000000040000000 (512MB)
Faking node 2 at 0000000040000000-0000000060000000 (512MB)
Faking node 3 at 0000000060000000-0000000080000000 (512MB)
...
On node 0 totalpages: 130975
On node 1 totalpages: 131072
On node 2 totalpages: 131072
On node 3 totalpages: 131072
現在,按照CPU 集中的說明掛載 CPU 集檔案系統後,您可以將偽節點(即連續的記憶體地址空間)分配給各個 CPU 集
[root@xroads /]# mkdir exampleset
[root@xroads /]# mount -t cpuset none exampleset
[root@xroads /]# mkdir exampleset/ddset
[root@xroads /]# cd exampleset/ddset
[root@xroads /exampleset/ddset]# echo 0-1 > cpus
[root@xroads /exampleset/ddset]# echo 0-1 > mems
現在,此 CPU 集 ‘ddset’ 將僅允許訪問偽節點 0 和 1 以進行記憶體分配 (1G)。
您現在可以將任務分配給這些 CPU 集,以根據分配為 mems 的偽節點限制可供它們使用的記憶體資源
[root@xroads /exampleset/ddset]# echo $$ > tasks
[root@xroads /exampleset/ddset]# dd if=/dev/zero of=tmp bs=1024 count=1G
[1] 13425
請注意 /proc/meminfo 報告的系統記憶體使用情況之間的差異,如上所示的受限 CPU 集情況和不受限情況(即,在不將其分配給偽 NUMA CPU 集的情況下執行相同的 ‘dd’ 命令)
名稱
不受限
受限
記憶體總計
3091900 kB
3091900 kB
可用記憶體
42113 kB
1513236 kB
這允許對分配給特定 CPU 集的任務進行粗粒度記憶體管理。由於 CPU 集可以形成層次結構,因此您可以為各種型別的任務建立一些非常有趣的用例組合,以滿足您的記憶體管理需求。