如何获取与调用者处理器同NUMA节点对齐的大页内存?
一、NUMA节点对齐的大页共享内存获取:认知澄清与可行方案
你提到的「shmat等接口无NUMA参数、libnuma无共享内存相关方法」是客观事实,但这不代表无法实现NUMA节点对齐的大页共享内存,核心是要结合大页预分配、挂载策略及进程绑定来完成:
预分配目标NUMA节点的大页
通过sysfs指定目标NUMA节点的大页预留数量,比如给节点0分配1024个2MB大页:echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages该操作会在对应NUMA节点预留专属大页池,避免被其他节点占用。
挂载hugetlbfs时指定NUMA节点
挂载hugetlbfs时通过node参数绑定目标NUMA节点,比如:mount -t hugetlbfs -o node=0 none /mnt/huge后续在该挂载点通过
shmget(带SHM_HUGETLB标志)创建的共享内存段,会严格使用节点0的大页,实现NUMA对齐。进程绑定辅助(可选但更灵活)
若不想固定挂载节点,可先用libnuma将当前进程绑定到调用者所在NUMA节点:int curr_node = numa_node_of_cpu(sched_getcpu()); numa_run_on_node(curr_node);之后调用
shmget创建大页共享内存,内核会遵循本地分配策略,优先从当前进程所在NUMA节点分配大页(前提是该节点有足够预分配大页)。
二、挂载时是否会隐式与调用者NUMA节点对齐?
不会。默认情况下内核仅遵循「本地节点优先」的分配策略,但这只是优先级而非强制约束:如果当前节点大页不足,内核会自动从其他NUMA节点分配。若需严格对齐,必须通过预分配+指定挂载节点,或进程绑定+预分配的方式主动保证,不存在隐式对齐机制。
三、大页内存是否不会被换出?
是的,hugetlbfs中的大页内存默认不会被换出。大页来自内核预留的物理内存池,不属于可交换内存范畴,无需额外调用mlock/mlockall锁定。只要是通过SHM_HUGETLB标志创建的大页共享内存段,会一直驻留在物理内存中,不会被交换到磁盘。
内容的提问来源于stack exchange,提问作者ecwdw 23e3e23e

