在即将到来的 Linux 6.10 合并窗口之前,Linux 内核的 SLUB 分配器补丁已经排好队,以帮助减少极端情况下的内存消耗。
华为工程师陈军的补丁将有助于降低极端情况下的内存消耗。陈军解释了这项工作:
当调用 kmalloc_node()时不使用 __GFP_THISNODE,且目标节点缺乏足够的内存时,SLUB 会从请求节点以外的其他节点分配一个对开,而不是从它那里获取部分板块。
但是,由于所分配的对开部分不属于所请求的节点,因此在接下来的分配中,它将被停用,并被添加到它所属节点的部分板块列表中。
当请求的节点内存不足时,这种行为会导致内存使用过多,因为 SLUB 会重复从其他节点分配对开区,而不会重复使用之前分配的对开区。
为了防止内存浪费,当首选节点被指明(不是 NUMA_NO_NODE),但事先没有__GFP_THISNODE 约束时:
1) 通过在 pc.flags 中加入__GFP_THISNODE,尝试从目标节点获取部分板块,以获取_partial()
2) 如果 1) 失败,则尝试从目标节点分配一个新的板块,并择机使用 GFP_NOWAIT | __GFP_THISNODE。
3) 如果 2) 失败,则使用原来的 gfpflags 重试,这将允许 get_partial() 在可能从其他节点分配新页面之前尝试其他节点的部分列表
在一个有四个 NUMA 节点、每个节点有 1GB 内存的 QEMU 虚拟机上进行测试并执行一个简单的测试案例时,Chen 发现通过 /proc/slabinfo 分配的对象数量从 13,519,712 降至 4,200,768 个。也就是说,在这种极端情况下,分配对象的数量仅为当前 Linux 内核的 31%。
该补丁位于 SLAB.git 仓库的 “for-next “分支中,将在 5 月中旬 Linux 6.10 合并窗口到来之前发布。
转自 Linux 6.10 SLUB Optimization To Reduce Memory Consumption In Extreme Scenarios – Phoronix