You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内核驱动分配2Mb大页后Huge_pages_free无变化问题咨询

内核态分配预分配大页的问题解析

你遇到的核心问题是混淆了透明大页(THP)和预分配静态大页两种机制:

  • 你使用的kmalloc(0x200000, GFP_KERNEL | __GFP_COMP)和alloc_pages(GFP_TRANSHUGE, HPAGE_PMD_ORDER)申请的是透明大页,这类大页由内核动态管理,无需提前预分配,/proc/meminfo中对应的统计项是AnonHugePages,而非HugePages_Free。
  • /proc/meminfo里的HugePages_Free统计的是预分配静态大页,这类大页需要提前通过用户态预留,且必须使用专门的API申请。

正确分配预分配静态大页的方法

如果目标是使用预分配的2MB大页,需按以下步骤操作:

1. 提前预分配大页(用户态)

通过sysfs接口预留大页,例如预分配10个2MB大页:

echo 10 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

执行后查看/proc/meminfo | grep Huge,会看到HugePages_Total变为10,HugePages_Free为10。

2. 内核态分配代码

使用hugetlb_alloc_pages()接口申请预分配的大页,示例代码:

#include <linux/hugetlb.h>

struct page *alloc_static_hugepage(void) {
    struct hstate *h = &default_hstate; // 对应默认2MB大页(需匹配系统配置)
    struct page *page;

    // 申请1个预分配大页,NUMA_NO_NODE表示不指定NUMA节点
    page = hugetlb_alloc_pages(GFP_KERNEL, 0, h, NUMA_NO_NODE);
    if (!page) {
        pr_err("Failed to allocate static huge page\n");
        return NULL;
    }

    // 分配成功后,HugePages_Free会减1,HugePages_Rsvd会加1
    return page;
}

void free_static_hugepage(struct page *page) {
    if (page) {
        hugetlb_free_pages(page, 1, &default_hstate);
    }
}

验证方式

  • 分配静态大页后,执行cat /proc/meminfo | grep Huge,会看到HugePages_Free数值减少,HugePages_Rsvd数值增加。
  • 若使用透明大页,需查看AnonHugePages或ShmemHugePages的数值变化。

内容的提问来源于stack exchange,提问作者tensm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:07:56