有没有办法禁用对与给定 NUMA 节点/套接字关联的内存的访问NUMA机器?
我们与数据库供应商就我们的 HP DL560 机器存在一些争议。 DB 销售类型的技术支持人员很高兴我们无法使用 DL560,而必须购买新的 DL360,因为它们的插槽较少。我相信他们关心的是访问插槽间内存的速度。他们建议,如果我坚持保留 DL560,我应该将其中两个插槽留空。我认为他们错了(又名疯狂),但我需要测试来证明我的立场扎实。
我的配置:
机器有四个插槽,每个插槽有 22 个超线程物理核心,总共 176 个表观核心,总共 1.5 T 内存。操作系统是 Red Hat Enterprise Linux Server 版本 7.4。
lscpu 显示内容如下(部分):
$ lscpu | egrep 'NUMA|ore'
Thread(s) per core: 2
Core(s) per socket: 22
NUMA node(s): 4
NUMA node0 CPU(s): 0-21,88-109
NUMA node1 CPU(s): 22-43,110-131
NUMA node2 CPU(s): 44-65,132-153
NUMA node3 CPU(s): 66-87,154-175
如果我有权访问物理硬件,我会考虑从两个插槽中拔出处理器来证明我的观点,但我没有访问权限,也没有权限随意摆弄硬件。
下一个最好的办法是使用操作系统虚拟禁用套接字。我读过这个关联我可以用它来停止处理器的服务
echo 0 > /sys/devices/system/cpu/cpu3/online
事实上,处理器已经停止工作,但这并没有说明内存。
我刚刚关闭了套接字 #3 的所有处理器(使用 lscpu 查找套接字 #3 的处理器):
for num in {66..87} {154..175}
do
echo 0 > /sys/devices/system/cpu/cpu${num}/online
cat /sys/devices/system/cpu/cpu${num}/online
done
并得到:
$ grep N3 /proc/$$/numa_maps
7fe5daa79000 default file=/usr/lib64/libm-2.17.so mapped=16 mapmax=19 N3=16 kernelpagesize_kB=4
如果我正确地阅读了这篇文章,则表明我当前的进程正在使用套接字 #3 中的内存。除了当我关闭处理器时 shell 已经在运行。
我开始了一个新的进程,它会尽力吞噬内存并
$猫/proc/18824/numa_maps |查询 N3
最初不返回任何记录,但在长时间消耗内存后,它开始使用节点 3 上的内存。
我尝试使用节点 0,1,2 运行我的程序numactl
并绑定到节点 0,1,2,它按预期工作...除了我无法控制供应商的软件,并且 Linux 中没有规定可以像使用 0,1,2 那样设置另一个进程set_mempolicy
所使用的服务numactl
。
除了物理移除处理器之外,是否有办法强制解决该问题?
答案1
我相信他们关心的是访问插槽间内存的速度。他们建议,如果我坚持保留 DL560,我应该将其中两个插槽留空。
这与 QPI 或 UPI 链接的数量以及 Intel 可扩展性(因为您提到了 Xeon)有关nCPU的是否是4S、S4S、S8S。但事实上,有 4 个插槽,意味着您应该能够在任何地方以合理的速度访问 RAM(S4S 比 4S 快),但在这个级别最坏的情况下,它将比访问磁盘或磁盘快几个数量级。一些其他类型的 PCIe 存储。
对于给定的进程,在四路系统中的 CPU 0、1、2 或 3 上的某个特定内核上运行,那么最快的 RAM 访问就是挂在给定 CPU 内存控制器上的 RAM 芯片池。如果它必须跳过 QPI/UPI 链接到其他某个 cpu,然后才能访问该 RAM,那么它会是慢点并不是最佳的。但您首先必须权衡这一切与没有足够的共享 RAM 的关系。
是的,有一种方法可以强制解决这个问题,那就是
中央处理器组- 将进程限制为处理器和内存节点子集
cpuset 文件系统是内核 cpuset 机制的伪文件系统接口,用于控制进程的处理器放置和内存放置。它通常安装在/dev/cpuset。
答案2
尝试使用 cgroups 并将您的 cpu-socket 定义为组,并使用 cgrules(cgred、cgoups 规则引擎守护进程)将进程分配给该组。但首先:进程和内存将在 Linux 中使用 numa 策略进行分配。我认为默认策略是将进程的内存定位到进程运行的CPU插槽。每当您需要更多内存时,请注意最好使用其他 numa 节点上的内存,并且不要使用磁盘交换空间。
答案3
该程序在进程已经运行后使用:
taskset
- 设置或检索进程的 CPU 关联性taskset 命令用于设置或检索给定 pid 的正在运行的进程的 CPU 亲和力,或启动具有给定 CPU 亲和力的新命令。 CPU 关联性是一种调度程序属性,它将进程“绑定”到系统上给定的一组 CPU。 Linux 调度程序将遵循给定的 CPU 关联性,并且该进程不会在任何其他 CPU 上运行...
...用户必须拥有
CAP_SYS_NICE
更改属于另一个用户的进程的 CPU 亲和力。用户可以检索任何进程的关联掩码。
http://manpages.ubuntu.com/manpages/jammy/man1/taskset.1.html