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 集可以形成层次结构,因此您可以为各种类型的任务创建一些非常有趣的用例组合,以满足您的内存管理需求。