Memory management CentOs7:HugePages_Rsvd等于18446744073709551615

Memory management CentOs7:HugePages_Rsvd等于18446744073709551615,memory-management,linux-kernel,centos7,huge-pages,dpdk,Memory Management,Linux Kernel,Centos7,Huge Pages,Dpdk,我有一个应用程序,它使用了大量的巨大页面,目的是。我在系统启动时分配页面,然后多次加载/卸载应用程序。 重新加载后,程序无法再分配巨大的页面。当我看的时候,我看到: 这将保持这种方式,并不会让任何应用程序分配巨大的页面,直到我重新启动机器 有什么想法吗?递减页面resv\u vma函数尝试-1用于resv\u大页面, 但无符号算术导致它改为ULONG_MAX(无符号长resv_大页面),在64位系统上为18446744073709551615 alloc_huge_page() page

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

这将保持这种方式,并不会让任何应用程序分配巨大的页面,直到我重新启动机器


有什么想法吗?

递减页面resv\u vma函数尝试-1用于resv\u大页面, 但无符号算术导致它改为ULONG_MAX(无符号长resv_大页面),在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_剩余_pages()函数可能会溢出resv_巨大的_页面

在测试期间尝试下一步:

while [  1  ] ; do date | awk '{print $4}' >> HugePages_Rsvd.log; cat /proc/meminfo | grep HugePages_Rsvd >> HugePages_Rsvd.log; sleep 1;  done
如果resv_巨大的_页面将缓慢增加,那么问题在h->resv_巨大的_页面+=delta

但若resv_大页面突然变为-1(unsigned long==18446744073709551615),那个么h->resv_大页面中的问题--;(resv_大页面为0,递减后==-1)

取决于您的内核,您可以检查补丁 mm:numa:禁用vma(VM_HUGETLB)的更改保护 6b79c57b92cdd90853002980609af516d14c4f9c
我想这确实是2**64-1,这一事实有一定的意义。谢谢!那么你认为这个问题可能与你发送的链接中建议的补丁有关吗?我不太清楚什么应用程序行为会导致此错误。调试将显示。尝试cat/proc/+app而不是ftrace。使用调试信息重建内核的最佳方法。
while [  1  ] ; do date | awk '{print $4}' >> HugePages_Rsvd.log; cat /proc/meminfo | grep HugePages_Rsvd >> HugePages_Rsvd.log; sleep 1;  done