2016-12-21 67 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显示什么? –