page_alloc setup_min_slab_ratio
setup_min_slab_ratio()是 NUMA 系统中用于计算min_slab_pages阈值的函数。这个阈值决定了zone_reclaim节点回收是否应该触发slab 缓存回收。核心作用与背景与setup_min_unmapped_ratio()类似setup_min_slab_ratio()计算的是回收 slab 的“值不值得”门槛。在 NUMA 系统中当本地节点内存不足时内核可以选择回收本地节点的可回收 slab 页如 dentry、inode 缓存而不是直接去远程节点分配。min_slab_pages就是这个决策的门槛只有当可回收 slab 页数超过这个阈值时zone_reclaim才值得去扫描并回收 slab。实现现代内核现代内核v5.2 之后的实现是pgdat 级的static void setup_min_slab_ratio(void) { pg_data_t *pgdat; struct zone *zone; for_each_online_pgdat(pgdat) pgdat-min_slab_pages 0; for_each_zone(zone) zone-zone_pgdat-min_slab_pages (zone_managed_pages(zone) * sysctl_min_slab_ratio) / 100; }逐步解析1. 遍历在线节点并清零for_each_online_pgdat(pgdat) pgdat-min_slab_pages 0;先清空所有在线节点的min_slab_pages为累加做准备。2. 遍历所有 zone 累加阈值for_each_zone(zone) zone-zone_pgdat-min_slab_pages (zone_managed_pages(zone) * sysctl_min_slab_ratio) / 100;对每个 zone计算zone_managed_pages(zone) * sysctl_min_slab_ratio / 100。把结果累加到该 zone 所属节点的min_slab_pages上。sysctl_min_slab_ratio默认值为5即 5%可通过/proc/sys/vm/min_slab_ratio调整。与setup_min_unmapped_ratio()的对称性方面setup_min_unmapped_ratio()setup_min_slab_ratio()控制的阈值pgdat-min_unmapped_pagespgdat-min_slab_pagessysctl 参数vm.min_unmapped_ratio默认 1vm.min_slab_ratio默认 5计算方式zone_managed_pages * ratio / 100同左语义未映射文件页回收门槛可回收 slab 页回收门槛两者都是pgdat 级阈值分别控制zone_reclaim对文件页缓存和slab 缓存的回收决策。历史演进与近期变化2022 年Miaohe Lin引入min_slab_pages参与shrink_node的触发条件。在此之前shrink_node只在node_pagecache_reclaimable min_unmapped_pages时被调用补丁后增加了NR_SLAB_RECLAIMABLE_B min_slab_pages的条件。2026 年RFC 补丁指出当前min_slab_pages只决定是否进入shrink_node但进入后shrink_node仍然会回收 slab即使 slab 已经低于阈值。提案引入scan_control标志让min_slab_pages真正只限制 slab 回收——当可回收 slab 低于阈值时即使进入了shrink_node也跳过 slab shrinker。2025 年的移除提案搜索结果中有一个 2025 年 12 月的补丁系列提议移除setup_min_slab_ratio()和sysctl_min_slab_ratio-static void setup_min_slab_ratio(void) -{ - pg_data_t *pgdat; - struct zone *zone; - - for_each_online_pgdat(pgdat) - pgdat-min_slab_pages 0; -... - zone-zone_pgdat-min_slab_pages (zone_managed_pages(zone) * - sysctl_min_slab_ratio) / 100; -}这表明社区可能认为该机制的价值有限或已被更通用的回收策略取代。总结setup_min_slab_ratio()是NUMA 节点 slab 回收的门槛计算器它遍历所有在线节点和 zone按zone_managed_pages * sysctl_min_slab_ratio / 100累加出每个节点的min_slab_pages阈值。只有可回收 slab 页超过这个阈值时zone_reclaim才值得触发 slab 回收。它从早期的 zone 级计算演进为 pgdat 级与setup_min_unmapped_ratio()对称共同控制 NUMA 节点回收的触发条件。