在Mac OS X Yosemite 10.10.5上,当我尝试运行需要分配和使用128 GB内存的计算(这是用C语言编写的命令行程序)时,内核会以极大的偏见杀死我的进程。此控制台日志条目是一个实例的示例:
15/9/25 7:08:40.000 PM内核[0]:低交换:杀死pid 6202(huffgrp)
分配并使用64 GB内存时,该计算可以在合理的时间内正常运行。我的Mac硬盘上有32 GB的RAM和beaucoup空间。我还在另一台具有8 GB RAM的Mac上进行了尝试,在该Mac上64 GB计算也可以正常运行,当然需要更长的时间,但是128 GB计算却以相同的方式被内核杀死。
顺便说一句,malloc()
无论我要多少空间,都永远不会返回错误。一旦进程实际使用了过多的内存,内核将终止进程,从而导致大量交换到硬盘驱动器。
因此,似乎存在一个秘密的交换空间限制,介于64 GB和128 GB之间。
我的问题是:如何重新配置内核以允许更多交换空间?我找到了一个有前途的文件,/System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
但看不到其中的秘密号码。的手册页dynamic_pager
说,它所做的只是设置交换文件的名称和位置。该手册页中有较旧的版本,其中记录了-S
用于设置所创建交换文件大小的选项。我尝试过,请求160 GB交换文件,但是没有效果。每个交换文件仍为1 GB,该进程仍被内核杀死。
malloc
拥有更多,是因为commit_limit非常高(可能是无限的)。因此,操作系统将分配它没有的内存(这是在押注该进程将不会使用它,操作系统通常会赢得此押注)。您可能希望将提交限制调整为内存限制,这样该过程将尽早失败。
malloc()
会这样。我偏向可能认为我没有检查的返回值的人的评论malloc()
。顺便说一句,我的目标是不及早失败。我的目标是成功。