资讯动态

page_alloc calculate_min_free_kbytes

发布时间:2026/10/19 4:42:22 来源:尧图企业网站定制
calculate_min_free_kbytes()是内核中用于根据系统内存大小自动计算min_free_kbytes默认值的函数。它通常在启动初始化阶段被init_per_zone_wmark_min()调用。核心作用与背景min_free_kbytes是内存管理中最低保留内存的全局参数。它决定了每个 zone 的WMARK_MIN水位是内核在内存紧张时保留的最后一道防线。用户可以通过/proc/sys/vm/min_free_kbytes手动设置但如果没有设置内核需要一个自动计算的默认值。典型实现典型的计算逻辑如下static void calculate_min_free_kbytes(void) { unsigned long lowmem_kbytes; int new_min_free_kbytes; lowmem_kbytes nr_free_buffer_pages() * (PAGE_SIZE 10); new_min_free_kbytes int_sqrt(lowmem_kbytes * 16); if (new_min_free_kbytes user_min_free_kbytes) { min_free_kbytes new_min_free_kbytes; if (min_free_kbytes 128) min_free_kbytes 128; if (min_free_kbytes 262144) min_free_kbytes 262144; } else { pr_warn(min_free_kbytes is not updated to %d because user defined value %d is preferred\n, new_min_free_kbytes, user_min_free_kbytes); } }逐步解析1. 计算低端内存大小KBlowmem_kbytes nr_free_buffer_pages() * (PAGE_SIZE 10);nr_free_buffer_pages()前面讲过的统计用户态可用的空闲页总数。PAGE_SIZE 10把页数转换为 KB假设 PAGE_SIZE 为 4KB则 10即除以 1024。结果lowmem_kbytes是直接映射内存的总大小KB。2. 平方根公式计算默认值new_min_free_kbytes int_sqrt(lowmem_kbytes * 16);这是核心公式min_free_kbytes sqrt(低端内存大小(KB) × 16)。1GB 内存sqrt(1024×1024 × 16) ≈ sqrt(16M) ≈ 4MB4GB 内存约 8MB16GB 内存约 16MB。搜索结果的注释也印证了这一点min_free_kbytes 4 * sqrt(lowmem_kbytes)因为sqrt(lowmem_kbytes * 16) 4 * sqrt(lowmem_kbytes)。这个公式的设计意图是内存越大保留量按平方根增长——保留比例逐渐减小但绝对保留量逐渐增加。3. 与用户设置比较if (new_min_free_kbytes user_min_free_kbytes) { min_free_kbytes new_min_free_kbytes; ... } else { pr_warn(min_free_kbytes is not updated to %d because user defined value %d is preferred\n, new_min_free_kbytes, user_min_free_kbytes); }user_min_free_kbytes是用户通过 sysctl 设置的值初始为-1表示未设置。如果自动计算值大于用户设置值则采用自动计算值。否则保留用户设置值并打印警告。4. 边界限制if (min_free_kbytes 128) min_free_kbytes 128; if (min_free_kbytes 262144) min_free_kbytes 262144;下限 128KB防止设置过小导致系统无法正常回收。上限 262144KB256MB历史上曾是 64MB2020 年的补丁将其提高了 4 倍以应对现代企业级系统的大内存和高速网卡场景。历史演进2005 年引入min_free_kbytes的平方根计算公式上限设为 64MB。2016 年修复了 khugepaged 初始化顺序问题确保 THP 推荐值不会被init_per_zone_wmark_min()覆盖。2020 年Joel Savitz 的补丁将上限从 64MB 提高到 256MB以解决高速网卡场景下的分配失败问题。2023 年讨论过修改计算规则以包含ZONE_MOVABLE但未合并。总结calculate_min_free_kbytes()是min_free_kbytes默认值的自动计算器它用sqrt(低端内存(KB) × 16)的平方根公式计算默认值与用户设置比较后取较大者并限制在[128KB, 256MB]范围内。这个公式让内存越大的系统保留越多的最低空闲内存是水位线计算和内存回收触发的基础。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑