CentOs7:HugePages_Rsvd等于18446744073709551615

时间:2015-07-20 11:04:30

标签: memory-management linux-kernel centos7 huge-pages dpdk

我有一个使用大量大页面的应用程序,用于DPDK。我在系统启动时分配页面,然后多次加载/卸载应用程序。 重新加载后,程序无法再分配大页面。当我查看meminfo时,我看到了:

HugePages_Total:    2656
HugePages_Free:     1504
HugePages_Rsvd:     18446744073709551615   
HugePages_Surp:        0

这将保持这种方式,并且在我重新启动计算机之前不会让任何应用程序分配大页面。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

对于resv_huge_pages,decrement_hugepage_resv_vma函数尝试-1, 但无符号算术导致它改为ULONG_MAX(unsigned long resv_huge_pages),在64位系统上为18446744073709551615。

alloc_huge_page()
    page = dequeue_huge_page_vma(h, vma, addr, avoid_reserve)
        decrement_hugepage_resv_vma() {
            h->resv_huge_pages--;
        }

static void return_unused_surplus_pages(struct hstate *h,
                    unsigned long unused_resv_pages)
{
    h->resv_huge_pages -= unused_resv_pages;
}

其他不太可能的原因是gather_surplus_pages()函数可以溢出resv_huge_pages。

在测试期间尝试下一步:

while [  1  ] ; do date | awk '{print $4}' >> HugePages_Rsvd.log; cat /proc/meminfo | grep HugePages_Rsvd >> HugePages_Rsvd.log; sleep 1;  done

我猜想resv_huge_pages是否会缓慢增加,所以h-> resv_huge_pages + = delta;

但是如果resv_huge_pages突然变为-1(unsigned long == 18446744073709551615),那么问题就在h-> resv_huge_pages--; (resv_huge_pages为0且aftre减量== -1)

取决于您的内核,您可以检查补丁 mm:numa:禁用vma的更改保护(VM_HUGETLB) 6b79c57b92cdd90853002980609af516d14c4f9c 和BUG large value for HugePages_Rsvd