如何增加Mac OS X上的最大交换空间?


14

在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,该进程仍被内核杀死。


我也将此问题发布在apple.stackexchange.com上,但那里没有任何回应。
马克·阿德勒

1
之所以可以malloc拥有更多,是因为commit_limit非常高(可能是无限的)。因此,操作系统将分配它没有的内存(这是在押注该进程将不会使用它,操作系统通常会赢得此押注)。您可能希望将提交限制调整为内存限制,这样该过程将尽早失败。
ctrl-alt-delor

我不明白为什么您认为第5款是正确的,但它并不接续第4款(尽管您以“ so”开头)。您是否也尝试添加很多交换?(问题尚不清楚,尽管我怀疑答案是肯定的)。
ctrl-alt-delor

@richard是的,我知道为什么malloc()会这样。我偏向可能认为我没有检查的返回值的人的评论malloc()。顺便说一句,我的目标是不及早失败。我的目标是成功。
Mark Adler

@richard因为内核消息显示“低交换”。至于“增加大量交换”,不,我没有这样做,因为我不知道怎么做。这正是这个问题。 如何添加交换空间?当然,内核会自动添加交换空间,但只能达到上限。因此,问题的根源在于:如何增加内核的交换空间限制?
Mark Adler

Answers:


4

这不是您要的答案,但是如果您创建适当大小的自己的文件,将其映射到您的进程中,然后在该地址空间中运行计算,则其效果应与交换文件相同,并且可以保证有空间,而不是与其他进程竞争可用的RAM /交换。

根据您覆盖数据的频率,它可能还会变慢,但应具有更大的可移植性。


2
好点子!我寄予厚望。las,他们冲破现实的严峻环境。就像以前一样,该进程仍被内核大量交换杀死(“低交换”控制台消息),即使该进程使用的是我创建的用作虚拟内存的文件mmap()
Mark Adler

抱歉,我的大部分经验是使用Linux。但是,问题可能出在内核没有刷新回文件并将其保存在RAM中。如果您定期打电话msync()要求它这样做怎么办?
2015年

0

我的Mac信息已过时,可能不再有内核魔术来执行此操作。因此,我建议对该程序使用Linux,您可以在其中非常简单地将文件夹或分区挂载为swap。

消除使用动态交换文件夹的不确定性。创建一个物理交换分区(只是一个空的未格式化分区,其磁盘表类型代码用于交换,在Linux中为十六进制代码)0x82。然后:

  1. 编辑/ etc / rc文件,找到swap部分的所有注释。添加线mount -vat swap
    • 表示将所有交换分区挂载到/ etc / fstab中
  2. pdisk /dev/disk? -dump
    • “?” 是您的hd的磁盘编号,记录交换分区旁边的编号
  3. 编辑或创建/ etc / fstab(它可能不存在),添加一行 /dev/disk?s?? none swap sw 0 0
    • ?是您的磁盘。
    • ?? 是交换分区的编号。
  4. 重启。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.