当仍有“非活动”内存时,如何禁止Mac OS X使用交换功能?


61

在OS X的日常使用中(根据互联网上各种帖子的说法,这是一种常见现象),只要没有“可用”内存可用,该系统就会变慢。据推测,这是由于交换引起的,因为明显有大量磁盘活动,并且vm_stat报告了许多页面输出。(纠正我的错误)

但是,交换开始/发生/结束时,“非活动”内存的数量通常约为所有可用内存的12.5%-25%(^ 1。)。

根据http://support.apple.com/kb/ht1342

无效的内存

内存中的该信息并未得到积极使用,但是最近才被使用。

例如,如果您一直在使用Mail,然后退出它,则Mail所使用的RAM被标记为非活动内存。此闲置内存可供其他应用程序使用,就像可用内存一样。但是,如果在其他应用程序使用其非活动内存之前打开邮件,则Mail将打开得更快,因为其非活动内存已转换为活动内存,而不是从速度较慢的硬盘加载邮件。

并且根据http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html进行

非活动列表包含当前驻留在物理内存中但最近未访问过的页面。这些页面包含有效数据,但可以随时从内存中释放

因此,基本上:程序退出后,其内存将被标记为“不活动”,并且应随时可以声明。尽管如此,每当“可用”内存变低时,OS X仍希望开始将内存换出到Swap文件中,而不是仅声明该内存。

为什么?比起立即释放不活动的内存甚至不触摸交换文件,此行为的优点是什么?一些消息来源(^ 2。)表示OS X会在释放它之前调出“非活动”内存以进行交换,但是如果现在可以随时从内存中释放内存,那现在变得没有意义了吗?交换很昂贵,发布很便宜,对吧?

可以使用某些首选项或已知的技巧来更改此行为吗?(最好不要完全禁用swap / dynamic_pager并重新启动...)

我确实感谢purge命令以及修复磁盘权限以强制使用一些可用内存的概念,但是与真正解决交换/释放决策逻辑相比,这是痛苦地强制使用更多可用内存的方法...

顺便说一句类似的问题在这里问: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,即osx似乎将大约12.5%-25%的ram保留为“非活动”内核逻辑。

^ 2。例如https://apple.stackexchange.com/questions/4288/what-does-it-mean-if-i-have-lots-of-inactive-memory-at-the-end-of-a-work-日

一旦使用完所有内存(可用内存为0),操作系统就会将非活动内存写出到交换文件中,以在活动内存中留出更多空间。

更新2012年3月17日

这是到目前为止建议的一些方法的综述:

所述吹扫命令

“用于通过冷盘缓冲区高速缓存来近似初始启动条件以进行性能分析。它不会影响通过malloc,vm_allocate等分配的匿名内存。”

这对于防止osx换出磁盘缓存很有用(这很荒谬,osx实际上是这样做的),但缺点是释放了磁盘缓存,这意味着如果磁盘缓存不打算换出后,最终只会得到一个冷盘缓冲区高速缓存,可能会对性能产生负面影响。

FreeMemory应用程序和/或修复磁盘权限,迫使一些免费存储

无济于事地释放任何内存,仅将GB的内存内容从ram移动到hd。最后,当我尝试使用释放内存时打开的应用程序时,这会导致大量交换,因为它的许多虚拟机现在都处于交换状态。

使用dynamicpagerwrapper加速交换分配

为了加快交换使用速度似乎是一件好事,但是在内存仍然处于非活动状态时,首先没有解决osx交换的问题。

通过禁用dynamicpager并重新启动来禁用交换

使用所有内存时,这将迫使osx不使用swap来挂起系统挂起的价格。并非可行的选择...

使用被入侵的dynamicpager禁用交换

类似于禁用上面的dynamicpager一样,从博客评论的摘录中可以看出,这不是可行的解决方案:“非活动内存与往常一样高”。“当系统内存不足时,整个操作系统会挂起...”,“如果您消耗了mac的全部内存,则计算机可能会挂起”

总结起来,当内存仍然处于“非活动”状态时,我仍然不知道如何禁止Mac OS X使用交换功能。如果不可能,那么至少在某种程度上可以解释为什么osx倾向于换出可能随时从内存中释放的内存


1
我遇到了这个问题,可以通过“活动监视器”中的数字进行说明:bassistance.de/i/f2322d.png 几乎没有可用的内存,但是有很多不活动的内存。正如您可以从40 GB的页面输出中看到的那样,OSX宁愿重新开始进行大量交换,也没有回收它。
约恩·泽弗勒

我有足够的可用内存,但仍在使用多个GB的交换空间。16GB rMBP。
史蒂文·卢

1
显然,有些人已经报告了运行“清除” apple.stackexchange.com/questions/67031/…的好处
rogerdpack 2014年

Answers:


19

根据定义,非活动内存是准备分页的内存,分页可能涉及将其写入交换空间。这不是应该优化的任何问题。实际上OS X是按设计运行的

不幸的是,技术支持作者不是内核开发人员,并且当Apple知识库支持文章引用非活动内存是程序未使用的内存时,这是错误的。当您退出程序时,其所有驻留内存都变为Free;它不会在非活动状态中停止。但是,如果已阅读全文,则指向开发人员站点的第二个链接(描述内存管理的工作方式)是一个很好的资源。

关于OS X中“非活动内存”的含义有很多误解。与这些误解相反,并非所有非活动内存都是空的,未使用的,高速缓存的或可清除的。实际上,如果最近访问过活动内存,则也可以缓存或清除活动内存。许多不活动的内存还包含无法简单丢弃的数据。如果将其丢弃,则程序将崩溃,因为被丢弃的页面将包含有效数据(如OS X开发人员那边的引用所述),并且程序期望它们存储在(虚拟)内存中的数据不会消失。

非活动内存包含与活动内存相同类型的数据。唯一的区别是OS X已经注意到一段时间内没有读取或写入某些内存块。

OS X将某些内存分类为非活动而将其他区域分类为“活动”的原因与分页有关。当内存不足时,您将不得不分页一些数据。问题是,哪些数据?如果分页出程序立即需要的数据,那会浪费时间,什么也不做。因此,您想调出程序将不再需要再次使用的内存。

预测将来可能不需要的页面是困难的,因为程序可以使用其虚拟内存,但是会喜欢它,而不会告诉操作系统有关其计划的任何信息。但是作为一种启发式方法,大多数程序的内存使用情况都是“粘性的”。如果他们有一段时间没有使用某些内存,则他们可能会继续不使用该内存,并可能继续使用他们最近使用过的内存。

因此,当操作系统决定分页一些数据时,它将采取交换最近未使用过的页面的策略。这就是为什么OS X将程序占用的内存分为“活动”和“非活动”两堆的原因。在上面贴链接到开发者网站,如果充分阅读,告诉这个过程是如何发生的:

  • 当内存开始变低时,操作系统将开始浏览活动内存页面,并在每个页面上设置一个标志。
  • 如果程序读取或写入页面,则清除该标志。
  • 如果经过一段时间的延迟后仍未清除该标志,则将该页面分类为“非活动”堆。
  • 如果其程序访问“非活动”页面,则将其放回“活动”堆中。
  • 当内存用完时,“非活动”页面将被调出。

请注意,在所有现代操作系统中,用于决定换出哪个内存的排序过程都是相似的。Linux具有活动页面和非活动页面的两个相同列表,如了解Linux虚拟内存管理器中所述。Windows可能使用略有不同的东西,并且具有两种以上的新近度;我目前找不到最新,可靠的技术说明。在维基百科页面上标题为“页面替换算法”的页面上讨论了更多的实现。与OS X的唯一区别是统计信息的显示方式:有人认为最好为top活动监视器或活动监视器显示单独的数字是一个好主意。回想起来,这可能不是一个好主意(并且在OS X 10.9中已更改。)

设置和清除标志以及维护活动/非活动堆的过程确实需要一点处理器能力。因此,当有大量可用内存时,OS X不会执行此操作。因此,您启动的第一个程序将显示为所有“活动”内存,直到可用内存开始用尽为止。

因此,从空白开始,打开越来越多的程序,您可以期望在活动监视器中看到以下进度:

  • 首先,有很多“可用”内存,很少有闲置内存。这是因为内存标记程序尚未开始运行。
  • 随着可用内存量的减少,OS X将开始运行其内存标志器,并且您将开始看到“非活动”量的增加。每一个“不活动”以前都是“活动”。
  • 当可用内存不足时,“非活动”堆中的页面将被分页。内存标记器还将运行全倾斜,以将内存分为活动状态和非活动状态。通常,在写入交换时,您会看到很多“非活动”状态,这表明内存标记正在执行应有的操作。

页面必须在换出之前被分类为非活动状态。这就是Apple Developer网站上的引语所说的:“这些页面包含有效数据,但随时可能从内存中释放出来。” 这与活动页面相反,活动页面只有在将其降级为“不活动”后才会释放。有多种释放页面的方法。如果页面是从文件映射的,并且尚未修改,则可以立即将其删除并按需重新读取。类似地,如果是以前换出的内存,但自从换入后未进行修改。程序还可以显式分配缓存和可清除内存,以存储可以按需忘记和重新创建的数据(但是程序分配缓存的原因是否需要大量时间来重新创建该数据。

因此,查看“活动监视器”中的“非活动”内存量,并发现在计算机写入交换的同时有很多非活动状态,这只能告诉您系统正在按设计工作。

非活动内存和文件缓存之间也存在混淆。我不确定为什么会有这种混淆,因为活动监视器已经在单独的标题下列出了它们。高速缓存是用于存储已从文件系统读取或写入的最新数据的内存,以防需要再次访问它们。当内存不足时,OS X确实倾向于先摆脱缓存。如果您有交换问题,并且活动监视器显示一大堆缓存(不是非活动状态),那将是一个问题。但是不活动的内存是另一回事。

如有疑问,请忽略“非活动”和“活动”之间的区别。将它们视为“程序使用的内存”的一个集合,并将两个数字加在一起。这是每个其他操作系统在告诉您有关内存使用情况时所做的事情。

对于OS X 10.9的注释: Mavericks引入了“内存压缩”,它或多或少是另一层交换。现在,活动页面被分类为非活动状态,然后进行压缩(取决于您使用的工具,它可能会显示为内核内存),然后随着内存使用量的增加而写入交换。小牛也已经停止在活动监视器中显示活动和不活动的单独数字,因为事实证明这并不是一件有用的事情,特别是考虑到围绕它的错误观念。


4

当前,尚无简便的方法来调整macos X的可交换性(或称其为“行为”)。不过,有一些可用的技巧(需要开发者帐户和SDK):

http://cestdelamerde.com/archives/22-Killing-Mac-OS-X-Swapping-How-To-Disable-dynamic_pager.html

http://dropsafe.crypticide.com/article/3848

祝好运!

后记。我想您可能想读这个答案(也是我本人),以便对MacOSX中的活动,非活动和其他内存有更一般的评论:有线内存与OS X中的活动内存


多谢您的回覆。调整交换性肯定会有所帮助-讨厌这并不容易!关于第一个链接,我实际上是在寻找一种不完全禁用swap / dynamic_pager并重新启动的hack,因为这需要太多的工作才能禁用swap使用,并且在接近少量时会使系统不稳定非活动和可用内存。第二个链接是指交换文件不断增长的问题。虽然这是一个重要的问题,尤其是当交换文件不足时,但这与我在此线程中遇到的问题并没有真正的关系……
Motin 2011年

4

这不是一个永久性的解决方案,但至少可以帮助回收一些不活动的内存,从而有可能避免可怕的交换:http : //itunes.apple.com/nz/app/freememory/id460931672?mt=12

该工具是免费的,非常易于使用。启动后,在系统工具栏/菜单中选择其“可用内存”选项。

与ActivityMonitor内存显示不同,它仅显示可用内存,这似乎是交换进行与否的更好指示。


自大约两个月前您的建议以来,我一直在评估此应用程序。看来,此应用确实确实通过各种技巧增加了“空闲”内存的数量,包括主动要求自己拥有大量内存,然后释放它。但是,这将导致“释放”的内存量相同。就是说这无助于释放任何内存,只是将内存内容从ram移动到hd。最后,当我尝试使用释放内存时打开的应用程序时,这会导致大量交换,因为它的许多虚拟机现在都处于交换状态。:(
Motin 2012年

@Motin,我已经使用FreeMemory几个月了,至少从我的经验来看,它没有这样做。如果我必须进行猜测(根据我在活动监视器中看到的内容),则不同之处在于FM首先消耗“活动”内存,其优先级高于磁盘缓存。它通过提高优先级来“释放”其他内存,然后释放自己的内存。我从未见过它会大大增加交换(可能是消耗时分配的少量)。
失明的眼神2012年

2

从OS X 10.5开始,MAC OS X中明显存在内存管理问题。然后,网络上已经充满了关于一段时间后系统速度急剧下降的抱怨。那时我使用的是速度较慢的机器,配备1GB RAM的Mac Mini,所以我(错误地)得出结论,这是由于劣质的硬件造成的。

现在我有2010 MBP,核心i7、8 GB RAM,双GPU。Mac os X Snow Leopard感到很痛苦,但是在迁移到OS X Lion之后,在MAC上进行一些严肃的工作开始成为一场噩梦。

我终于设法重现了有问题的情况,因此我进行了测试并将屏幕记录为视频。

MAC OS X Lion性能问题-损坏的内存管理

我在我的图片/文件夹中的大量图片文件上运行tar + bzip命令,这是基本的unix东西。在开始之前,我运行“清除”命令,以删除不活动/缓存的程序数据。

您可以在视频中看到可用内存开始迅速下降,并且闲置状态不断上升。如果您查看“ bsdtar”命令,它仅占用一部分RAM,因此问题不在此过程中。您不能说这是程序内存泄漏,因为那样的话问题不会出在不活动的ram上,而应该是活动/有线的。

当可用内存降到100mb以下时,我启动了一些应用程序,例如Safari,iPhoto和MS Word,您可以在视频中看到,启动应用程序甚至需要几分钟,在正常情况下(有可用RAM时),加载大约需要3-5秒。

我在Linux Centos 6机器上运行相同的场景和相同的命令,那里没有问题!内存使用量约为10-20mb,缓存/缓冲区没有问题。

在Mac OS X中,内存管理必须非常中断!


2
您将看到系统在内存中缓存文件。我同意这是一个问题,因为缓存似乎从未清除过……但是缓存本身(以及随之而来的非活动内存的增长)是一种理智的,有时有用的性能特征。
失明的眼神2012年

而且测试环境绝非无菌。我们无法确定QuickTime Player在做什么,或者其他任何程序都无法打开。
chrishiestand13年

1

我敢打赌,对此没有正确的答案。当Mac进入睡眠状态时,内存仍然保持活动状态,内存随着每次睡眠的增加而增长。

在“乐趣”(又名昂贵)方面,您可以升级内存或用SSD替换HDD,因此交换不会对性能造成影响。我选择了第一个选项,因为Corsair内存现在以合理的价格提供。

16GB RAM


2
请记住,SSD的写入周期有限。另请注意,对于未启用修剪的SSD,由于必须擦除闪存单元,因此写入最终可能会非常昂贵。
波浪蟹2012年

您能否在“睡眠导致内存使用增加”问题上引用一个来源?
GordonM

我可以引用我的经验吗?:)我进行了快速搜索,发现了以下内容:Discussions.apple.com/message/21624847#21624847 +有许多与非活动内存相关的主题在需要时不会被清除。我个人看到,每次睡眠后,不活动的记忆如何保持以前的状态并增加。“清除”是一个选项,但是我不想每20分钟清除一次不活动的内存(我敢保证4 GiB RAM就是这种情况)。

1
@WavyCrab SSD的写周期可能有限,但是您没有机会达到该限制。除非它是用于数据中心的SSD,否则我不必担心。在任何情况下,如果您要通过大量写入来关闭SSD,则会更快地关闭HDD。
andreadi 2014年
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.