2015-07-20 17 views
1

我有一個應用程序,它使用了大量的巨大頁面,用於DPDK。我在系統啓動時分配頁面,然後多次加載/卸載應用程序。 重新加載後,程序無法再分配大量頁面。當我看着meminfo,我看到:CentOs7:HugePages_Rsvd等於18446744073709551615

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

這將仍然是這樣,不會讓任何應用程序分配的大內存頁,直到我重新啓動機器。

有什麼想法?

+1

我相信有一定的指導意義事實上,這正是2 ** 64-1。 –

回答

3

的decrement_hugepage_resv_vma功能嘗試-1 resv_huge_pages, 但無符號算術使其代替ULONG_MAX(無符號長resv_huge_pages),這是18446744073709551615在64位的系統。

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 + =增量遞增慢慢等問題;

但是如果resv_huge_pages突然變成-1(unsigned long == 18446744073709551615)所以問題在h-> resv_huge_pages--; (resv_huge_pages是0和aftre遞減== -1)

依靠從你的內核,則可以檢查補丁 毫米:NUMA:禁用VMA(VM_HUGETLB)更改保護 6b79c57b92cdd90853002980609af516d14c4f9c 和BUG large value for HugePages_Rsvd

+0

謝謝!那麼你認爲這個問題可能與你發送的鏈接中建議的補丁有關嗎?我並不完全明白哪些應用程序行爲會導致此錯誤。 –

+0

調試將顯示。嘗試cat/proc/+應用程序比ftrace。用您的調試信息重建內核的最佳方式。 – cosinus0