将最大虚拟内存大小增加到 256gb 以上
Increase maximum virtual memory size above 256gb
我是 运行 一个 allocates 8mb stacks using mmap 的程序。在测试我可以分配多少堆栈(目标是 100,000)时,我发现虚拟内存大小如预期的那样迅速增加,而保留大小保持较小(小于 1gb)。然后程序出现 Cannot allocate new fiber stack: Cannot allocate memory (Errno)
的段错误。使用 gdb
挽救段错误然后查看 htop,我发现这种情况发生在大约 256GB 的虚拟内存上。
我试过在 运行 程序中使用 prlimit --as=unlimited --rss=unlimited --memlock=unlimited --data=unlimited
,但似乎没有什么不同。
有没有办法增加这个限制?增加这个限制是否可取? crystal 分配堆栈有更好的方法吗?
我会检查您的交换文件大小。如果您 运行 正在退出交换,那么在您修复该问题之前,所有这些参数更改都不会对您有所帮助。
我将重现故障并 运行 free -h 以查看是否有任何未使用的交换空间。如果它全部消失,您将需要增加交换大小。
也许您达到了 /proc/sys/vm/max_map_count
的最大值。此设置设置进程可以拥有的 mmap 数量的最大值。默认值为 65536。因此它可能不是您要 malloc 的内存大小,而是导致错误的 malloc 调用次数 Cannot allocate memory
.
您可以尝试增加最大值:
sysctl -w vm.max_map_count=131070
另见 NPTL caps maximum threads at 65528?
我是 运行 一个 allocates 8mb stacks using mmap 的程序。在测试我可以分配多少堆栈(目标是 100,000)时,我发现虚拟内存大小如预期的那样迅速增加,而保留大小保持较小(小于 1gb)。然后程序出现 Cannot allocate new fiber stack: Cannot allocate memory (Errno)
的段错误。使用 gdb
挽救段错误然后查看 htop,我发现这种情况发生在大约 256GB 的虚拟内存上。
我试过在 运行 程序中使用 prlimit --as=unlimited --rss=unlimited --memlock=unlimited --data=unlimited
,但似乎没有什么不同。
有没有办法增加这个限制?增加这个限制是否可取? crystal 分配堆栈有更好的方法吗?
我会检查您的交换文件大小。如果您 运行 正在退出交换,那么在您修复该问题之前,所有这些参数更改都不会对您有所帮助。
我将重现故障并 运行 free -h 以查看是否有任何未使用的交换空间。如果它全部消失,您将需要增加交换大小。
也许您达到了 /proc/sys/vm/max_map_count
的最大值。此设置设置进程可以拥有的 mmap 数量的最大值。默认值为 65536。因此它可能不是您要 malloc 的内存大小,而是导致错误的 malloc 调用次数 Cannot allocate memory
.
您可以尝试增加最大值:
sysctl -w vm.max_map_count=131070
另见 NPTL caps maximum threads at 65528?