29.5. 为 CPU 集伪造 NUMA¶
- 作者:
David Rientjes <rientjes@cs.washington.edu>
使用 numa=fake 和 CPU 集进行资源管理
本文档描述了如何将 numa=fake x86_64 命令行选项与 CPU 集结合使用,以进行粗粒度的内存管理。使用此功能,您可以创建代表连续内存块的伪造 NUMA 节点,并将它们分配给 CPU 集及其附加的任务。这是一种限制特定类型任务可用的系统内存量的方法。
有关 CPU 集功能的更多信息,请参阅CPU 集。您可以根据您的需求使用多种不同的配置。有关 numa=fake 命令行选项及其配置伪造节点的各种方法的更多信息,请参阅AMD64 特定启动选项。
为了本简介的目的,我们将假设一个非常原始的 NUMA 模拟设置 “numa=fake=4*512,”。这将把我们的系统内存分成四个大小相等的 512M 块,我们现在可以使用这些块来分配给 CPU 集。当您越来越熟悉将此组合用于资源控制时,您将确定一个更好的设置来最小化您必须处理的节点数量。
使用 dmesg 报告的 “numa=fake=4*512,”,一台机器可以按如下方式分割
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 集,以根据分配为 mem 的伪造节点来限制可用于它们的内存资源
[root@xroads /exampleset/ddset]# echo $$ > tasks
[root@xroads /exampleset/ddset]# dd if=/dev/zero of=tmp bs=1024 count=1G
[1] 13425
请注意上面受限的 CPU 集情况和不受限的情况(即在不将其分配给伪造 NUMA CPU 集的情况下运行相同的 ‘dd’ 命令)之间,/proc/meminfo 报告的系统内存使用情况的差异
名称
不受限制
受限制
MemTotal
3091900 kB
3091900 kB
MemFree
42113 kB
1513236 kB
这允许对分配给特定 CPU 集的任务进行粗粒度的内存管理。由于 CPU 集可以形成一个层次结构,您可以为各种类型的任务创建一些非常有趣的用例组合,以满足您的内存管理需求。