在 Mac OS X Yosemite 10.10.5 上,当我尝试运行需要分配和使用 128 GB 内存的计算(它是用 C 编写的命令行程序)时,内核会极端偏见地终止我的进程。此控制台日志条目是一个实例的示例:
2015 年 9 月 25 日 7:08:40.000 PM 内核[0]:低交换:杀死 pid 6202 (huffgrp)
当分配和使用 64 GB 内存时,计算工作正常,并且时间合理。我的 Mac 拥有 32 GB RAM 和精美的硬盘空间。我还在另一台具有 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,并且该进程仍然被内核终止。
答案1
不是您要求的答案,但如果您创建自己的适当大小的文件,将其映射到您的进程中,然后在此地址空间中运行您的计算,它应该具有与交换文件相同的效果,并且您保证拥有空间,而不是与其他进程竞争可用的 RAM/交换区。
它也可能会更慢,具体取决于您覆盖数据的频率,但应该更便携。
答案2
我的 mac 信息已经过时了,可能不再有内核魔法可以做到这一点。因此,我建议使用 Linux 来执行此程序,您可以非常简单地将文件夹或分区挂载为交换分区。
消除使用动态交换文件夹的不确定性。创建一个物理交换分区(只是一个空的未格式化分区,带有交换的磁盘表类型代码,在Linux中是十六进制代码0x82
。)然后:
- 编辑 /etc/rc 文件,找到交换部分,将其全部注释掉。添加行
mount -vat swap
- 表示挂载 /etc/fstab 中的所有交换分区
- 跑步
pdisk /dev/disk? -dump
- “?”是你的硬盘的磁盘号记录交换分区旁边的数字
- 编辑或创建 /etc/fstab (它可能不存在)添加一行,例如
/dev/disk?s?? none swap sw 0 0
- ?是你的磁盘。
- ??是交换分区的编号。
- 重启。