5

我正在运行一个使用 mmap 分配 8mb 堆栈的程序。在测试我可以分配多少堆栈(目标为 100,000)时,我看到虚拟内存大小按预期迅速增加,并且保留大小保持较小(小于 1gb)。然后程序会出现Cannot allocate new fiber stack: Cannot allocate memory (Errno). gdb用于挽救段错误然后查看 htop,我发现这发生在大约 256GB 的虚拟内存处。

prlimit --as=unlimited --rss=unlimited --memlock=unlimited --data=unlimited在运行程序时尝试过使用,但似乎没有什么不同。

有没有办法增加这个限制?是否建议增加此限制?水晶分配堆栈有更好的方法吗?

4

2 回答 2

5

也许你达到了最大值/proc/sys/vm/max_map_count。此设置设置您的进程可以拥有的 mmap 数量的最大值。默认值为 65536。因此可能不是您要 malloc 的内存大小,而是导致错误的 malloc 调用数Cannot allocate memory

您可以尝试通过以下方式增加最大值:

sysctl -w vm.max_map_count=131070

另请参阅NPTL 将最大线程数限制为 65528?

于 2017-03-23T13:47:28.253 回答
1

我会检查你的交换文件大小。如果你的交换用完了,那么在你修复它之前,所有这些参数更改都不会帮助你。

我会重新创建故障并运行 free -h 以查看是否有任何未使用的交换。如果一切都消失了,您将需要增加交换大小。

于 2016-12-22T18:08:34.780 回答