Mot*_*tin 68 memory swap osx-snow-leopard memory-management macos
我在 OS X 的日常使用中(以及根据互联网上的各种帖子显示的其他几种情况)中的一个常见现象,只要没有更多“可用”内存可用,系统似乎就会变慢。据称,这是由于交换造成的,因为明显的磁盘活动很重,并且 vm_stat 报告了许多页面输出。(纠正我的错误)
但是,当交换开始/发生/结束时,“非活动”内存的数量通常约为所有可用内存 (^1.) 的 12.5%-25%。
根据http://support.apple.com/kb/ht1342:
非活动内存
内存中的这些信息没有被积极使用,但最近被使用过。
例如,如果您一直在使用 Mail 然后退出它,Mail 使用的 RAM 将被标记为非活动内存。此非活动内存可供其他应用程序使用,就像空闲内存一样。但是,如果在其他应用程序使用其非活动内存之前打开 Mail,Mail 将打开得更快,因为它的非活动内存被转换为活动内存,而不是从较慢的硬盘加载邮件。
非活动列表包含当前驻留在物理内存中但最近未被访问的页面。这些页面包含有效数据,但可能随时从内存中释放。
所以,基本上:当一个程序退出时,它的内存被标记为 Inactive 并且应该可以随时声明。尽管如此,每当“可用”内存变低时,OS X 更愿意开始将内存换出到交换文件,而不是仅仅声明这块内存。
为什么?这种行为比立即释放非活动内存甚至不触及交换文件的优势是什么?一些消息来源 (^2.) 表明 OS X 会在释放“非活动”内存之前将其分页以进行交换,但是如果内存可能随时从内存中释放,现在这样做没有意义吗?交换很贵,释放很便宜,对吧?
可以使用某些偏好或已知的 hack 来改变这种行为吗?(最好是不包括完全禁用 swap/dynamic_pager 和重新启动...)
我很欣赏清除命令,以及修复磁盘权限以强制释放一些可用内存的概念,但这些是痛苦地强制更多可用内存而不是实际修复交换/释放决策逻辑的方法......
顺便说一句类似的问题在这里问:http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/这里:HTTP://hintsforums.macworld .com/showthread.php?t=87688但即使 OP 重新询问了核心问题,但没有任何回复给出了答案......
^1。2012 年 3 月 17 日更新自从我第一次发布这个问题以来,我已经从 4gb 到 8gb 的已安装内存,问题仍然存在。“非活动” ram 的数量以前是 0.5gb-1.0gb,现在在交换开始/发生/结束时通常约为 1.0-2.0GB,即似乎大约 12.5%-25% 的 ram 被 osx 保留为非活动状态内核逻辑。
一旦您的所有内存都用完(可用内存为 0),操作系统会将非活动内存写入交换文件,以在活动内存中腾出更多空间。
2012 年 3 月 17 日更新
以下是迄今为止建议提供帮助的方法的汇总:
所述吹扫命令
“用于使用冷磁盘缓冲区缓存来近似初始启动条件以进行性能分析。它不会影响已通过 malloc、vm_allocate 等分配的匿名内存”。
这对于防止 osx 换出磁盘缓存很有用(这很荒谬,因为 osx 实际上首先这样做),但有一个缺点是磁盘缓存被释放,这意味着如果磁盘缓存不即将被换出后,最终只会得到一个冷磁盘缓冲区缓存,可能会对性能产生负面影响。
该FreeMemory应用程序和/或修复磁盘权限,迫使一些免费存储
无助于释放任何内存,只会将几 GB 的内存内容从 ram 移动到 hd。最后,当我尝试使用在释放内存时打开的应用程序时,这会导致大量交换,因为它的许多 vm 现在都在交换中。
使用dynamicpagerwrapper加速交换分配
为了加快交换使用速度,这似乎是一件好事,但并没有首先解决 osx 交换的问题,同时仍然存在非活动内存。
通过禁用dynamicpager并重新启动来禁用交换
这将强制 osx 在使用所有内存时不使用交换系统挂起的价格。不是一个可行的选择...
使用被黑的 dynamicpager禁用交换
与上面禁用 dynamicpager 类似,博客文章评论的一些摘录表明这不是一个可行的解决方案:“非活动内存像往常一样高”。“当你的系统内存不足时,整个操作系统挂起......”,“如果你消耗了mac的全部内存,机器可能会挂起”
总而言之,我仍然不知道在仍然存在“非活动”内存时禁用 Mac OS X 使用交换的方法。如果不可能,也许至少可以在某处解释为什么 osx 更喜欢换出可能随时从内存中释放的内存?
cro*_*ing 22
根据定义,非活动内存是准备好分页的内存,分页可能涉及将其写入交换。这不是应该优化的任何类型的问题或问题;它实际上是OS X 按设计工作的。
不幸的是,技术支持作者不是内核开发人员,而且 Apple 知识库支持文章引用的说法是错误的,因为它声称非活动内存是程序未使用的内存。当你退出一个程序时,它的所有常驻内存都变为空闲;它不会在 Inactive 中停止。但是,如果完全阅读,开发人员站点的第二个链接描述内存管理的工作原理是一个很好的资源。
关于 OS X 中“非活动内存”的含义存在许多误解。与误解相反,并非所有非活动内存都是空的、未使用的、缓存的或可清除的。事实上,如果活动内存最近被访问过,它也可以被缓存或清除。许多非活动内存还包含不能简单丢弃的数据。如果它被丢弃,程序就会崩溃,因为被丢弃的页面将包含有效数据(正如 OS X 开发人员所说的那样),并且程序希望它们存储在(虚拟)内存中的数据不会消失。
非活动内存包含与活动内存相同类型的数据。唯一的区别是 OS X 已经注意到一些内存块有一段时间没有被读取或写入。
OS X 将某些内存归类为不活动而将其他区域归类为“活动”的原因与分页有关。当内存不足时,您将不得不调出一些数据。问题是,哪些数据?如果您将程序结果再次立即需要的数据分页出来,则会浪费时间并且一事无成。因此,您希望将程序不会立即再次使用的内存调出。
预测将来可能不需要哪些页面是很困难的,因为程序可以随意使用其虚拟内存,而不会告诉操作系统它的计划是什么。但作为一种启发式方法,大多数程序在内存使用方面是“粘性的”;如果他们有一段时间没有使用某些内存,他们可能会继续不使用该内存,并且可能会继续使用他们最近使用过的内存。
因此,当操作系统决定换出某些数据时,它会采用交换最近未使用的页面的策略。这就是为什么 OS X 将程序占用的内存分为两堆“活动”和“非活动”的原因。在上面贴链接到开发者网站,如果充分阅读,告诉这个过程是如何发生的:
请注意,确定要换出哪个内存的排序过程在所有现代操作系统中都是相似的。Linux 具有相同的两个活动页面列表和非活动页面列表,如了解 Linux 虚拟内存管理器中所述。Windows 可能会使用一些不同的东西,有两个以上的新近度;我目前找不到最近的可靠技术描述。在题为“页面替换算法”的维基百科页面中讨论了更多实现。与 OS X 的唯一区别是统计数据的显示方式:有人认为在top或活动监视器中显示活动和非活动的单独数字是个好主意。回想起来,这可能不是一个好主意(这在 OS X 10.9 中发生了变化。)
这个设置和清除标志以及维护活动/非活动堆的过程确实需要一点处理器能力。因此,当有大量可用内存时,OS X 不会这样做。因此,您启动的第一个程序将显示为所有“活动”内存,直到可用内存开始减少。
因此,当您从一张白纸开始并打开越来越多的程序时,您可以期望在活动监视器中看到以下进展:
页面必须在它们被换出之前被归类为非活动状态。这就是 Apple Developer 网站引用的意思,它说“这些页面包含有效数据,但可能随时从内存中释放”。这与活动页面相反,活动页面只有在它们被降级为非活动后才会被释放。发布页面有多种方式;如果页面是从文件映射出来的,并且没有被修改,它可以立即删除并按需重新读取。类似地,如果是先前已换出且自换入后未修改的内存。是如果重新创建该数据需要大量时间。
因此,查看活动监视器中的“非活动”内存量,并在计算机写入交换的同时看到大量非活动内存,只能告诉您系统正在按设计工作。
非活动内存和文件缓存之间也存在混淆。我不确定为什么会有这种混淆,因为活动监视器已经将它们列在单独的标题下。缓存是用于存储最近从文件系统读取或写入的数据的内存,以备再次访问时使用。当内存不足时,OS X 确实会先清除缓存。如果您有交换抖动,并且活动监视器显示一大堆缓存(不是非活动的),那么这将是一个问题。但非活动内存是另一回事。
如果有疑问,请忽略“非活动”和“活动”之间的区别。将它们视为一块“程序使用的内存”并将这两个数字相加。这是所有其他操作系统在告诉您内存使用情况时所做的。
OS X 10.9 注意: Mavericks 引入了“内存压缩”,或多或少是另一层交换。活动页面现在被归类为非活动页面,然后被压缩(根据您使用的工具,这可能显示为内核内存),然后随着内存使用量的增加写入交换。Mavericks 也已停止在 Activity Monitor 中显示单独的活动和非活动数字,因为事实证明它不是一个有用的东西,尤其是考虑到围绕它的误解。
| 归档时间: |
|
| 查看次数: |
53439 次 |
| 最近记录: |