我读过这篇关于 Mac OS X 内存管理的博客文章:http://workstuff.tumblr.com/post/20464780085/something-is-deeply-broken-in-os-x-memory-management
我想听听你对此事的看法。
我的内存“只有” 4GB,因此存在内核崩溃的可能性。
我确实有一个旋转的磁盘(而不是 SSD),并且偶尔会看到沙滩球,有时甚至会在继续之前旋转我的外部 HD。
它说目前没有使用交换,这是否意味着禁用 dynamic_pager 不会有任何作用?它确实有一些页面插入。
尝试一下是否安全?我是否可以编写一个脚本,在内存不足时重新启用寻呼机?
[更新]:一天结束时,26MB 交换,更多的页面进出,以及大量非活动内存。
答案1
OS X 有三个问题导致了这种情况:
默认情况下,任何写入或读取磁盘的数据都会以比最近程序数据更高的优先级缓存在 RAM 中。应用程序可以使用 选项针对每个描述符禁用此功能
F_NOCACHE
,fcntl()
但很少有应用程序这样做。因此,大量的磁盘活动会导致当时未使用的内存被换出。除了原始磁盘活动之外,这还会为换出和稍后读回内存创建更多的磁盘活动。HFS+ 不能很好地处理并发文件访问。特别是,同时打开和关闭许多不同的文件会造成巨大的争用,而且几乎每次只能发生一个打开/关闭操作。
许多 OS X 应用程序将其磁盘访问分散到许多小文件中。
因此,当两个或多个应用程序试图同时访问大量文件时,由于交换活动与应用程序竞争 I/O,磁盘 I/O 负载会呈指数增加。
禁用动态分页器可能会阻止该指数曲线的早期部分,因为这样就无法将私有/脏应用程序页面推送到磁盘。相反,系统可能会从公共/干净的映射文件(可执行文件、库等)和可能一开始就不应该缓存的缓存文件数据中清除页面。这是否真的能提高性能在很大程度上取决于您使用的应用程序。例如,Safari 在管理其磁盘 I/O 方面非常糟糕,所以我认为这会有所帮助。
如果实际所需的 RAM 量超出了可用量,就会出现问题:崩溃是结束一天的非常突然的方式。但如果您不编辑大文件或执行其他内存密集型操作,这种情况可能很少见,值得考虑冒险。
顺便说一句,您可以使用lsof
命令查看哪些进程打开了哪些文件,使用 命令fs_usage
查看文件操作的运行日志。以 root 身份或通过 运行这两种方式效果会更好sudo
。