2016-12-21 106 views
4

我正在運行一個程序,其中allocates 8mb stacks using mmap。在測試中可以分配多少堆棧(瞄準10萬個)時,我發現虛擬內存大小按預期迅速增加,並且保留大小保持很小(小於1gb)。該程序然後段錯誤Cannot allocate new fiber stack: Cannot allocate memory (Errno)。使用gdb來拯救segfault,然後看着htop,我發現這發生在大約256GB的虛擬內存上。增加256GB以上的最大虛擬內存大小

我試過在運行程序時使用prlimit --as=unlimited --rss=unlimited --memlock=unlimited --data=unlimited,但它似乎沒有什麼區別。

有沒有辦法增加這個限制?建議增加此限制嗎?有沒有更好的方式讓水晶分配堆棧?

回答

3

也許你正在碰到最大的/proc/sys/vm/max_map_count。此設置爲您的進程可以具有的最大mmaps數量。默認值是65536.所以它可能不是你想要malloc的內存大小,而是導致錯誤Cannot allocate memory的malloc調用的數量。

您可以嘗試提高最高搭配:

sysctl -w vm.max_map_count=131070 

又見NPTL caps maximum threads at 65528?

+1

這確實是極限,我將它增加到了1000萬,並獲得了超過500萬根水晶纖維。謝謝! – RX14

1

我會檢查你的交換文件大小。如果您的交換用完了,那麼所有這些參數更改都不會幫助您,直到您解決該問題。

我會重新創建失敗並運行空閒-h來查看是否有任何未使用的交換。如果它全部消失,則需要增加交換大小。

+0

我RAM和無交換空間的16GB,但我仍然可以分配的虛擬內存256GB。我不認爲交換是這裏的問題。 – RX14

+0

免費-h顯示什麼? –