當仍然有「不活動」記憶體時,如何停用 Mac OS X 使用交換區?

當仍然有「不活動」記憶體時,如何停用 Mac OS X 使用交換區?

這是我日常使用 OS X(以及其他一些根據整個互聯網上的各種帖子)的常見現象,每當沒有更多的“空閒”內存可用時,系統似乎就會變慢。據推測,這是由於交換造成的,因為磁碟活動很明顯並且 vm_stat 報告了許多頁面調出。 (糾正我的錯誤)

然而,當交換開始/發生/結束時,「非活動」內存量通常約為所有可用記憶體 (^1.) 的 12.5%-25%。

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

不活躍內存

記憶體中的這些資訊並未被主動使用,但最近被使用過。

例如,如果您一直在使用 Mail,然後退出它,則 Mail 正在使用的 RAM 將被標記為非活動記憶體。該非活動記憶體可供其他應用程式使用,就像空閒記憶體一樣。但是,如果您在其他應用程式使用其非活動內存之前打開 Mail,則 Mail 將打開得更快,因為其非活動內存已轉換為活動內存,而不是從較慢的硬碟加載郵件。

並根據http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html:

非活動清單包含目前駐留在實體記憶體中但最近未被造訪過的頁面。這些頁麵包含有效數據,但是可能隨時從記憶體中釋放

因此,基本上:當程式退出時,它的記憶體會被標記為“非活動”,並且應該隨時可以聲明。儘管如此,每當「可用」記憶體變低時,OS X 更願意開始將記憶體交換到交換文件,而不是僅僅聲明該記憶體。

為什麼?與立即釋放非活動記憶體甚至不觸及交換文件相比,這種行為有什麼優勢?一些來源 (^2.) 表明 OS X 會在釋放「非活動」記憶體之前將其調出以進行交換,但是如果記憶體現在這樣做,那麼這樣做就沒有意義了可能隨時從記憶體中釋放?交換很昂貴,釋放很便宜,對嗎?

可以使用某些偏好或已知的技巧來改變這種行為嗎? (最好不包括完全禁用 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 日更新自從我第一次發布這個問題以來,我已經將安裝的 ram 從 4GB 增加到 8GB,但問題仍然存在。 「不活動」ram 的數量以前為 0.5gb-1.0gb,現在在交換開始/發生/結束時通常約為 1.0-2.0GB,即,似乎大約 12.5%-25% 的 ram 被 osx 保留為不活動內核邏輯。

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

一旦所有記憶體都被使用(可用記憶體為 0),作業系統會將不活動記憶體寫入交換文件,以便在活動記憶體中騰出更多空間。

2012 年 3 月 17 日更新

以下是迄今為止建議提供幫助的方法的總結:

清除命令

「用於使用冷磁碟緩衝區快取來近似初始啟動條件以進行效能分析。它不會影響透過 malloc、vm_allocate 等分配的匿名記憶體」。

這對於防止 osx 交換磁碟快取很有用(這很荒謬,osx 實際上首先這樣做),但缺點是磁碟快取被釋放,這意味著如果磁碟快取不打算被釋放,如果換出,最終會得到一個冷的磁碟緩衝區緩存,可能會對效能產生負面影響。

自由記憶體應用程式和/或修復磁碟權限以強制釋放一些內存

沒有幫助釋放任何內存,僅將一些 GB 的內存內容從 RAM 移動到硬碟。最後,當我嘗試使用在釋放記憶體時打開的應用程式時,這會導致大量交換,因為它的許多虛擬機器現在都處於交換狀態。

使用加速交換分配動態分頁包裝器

為了加速交換使用,這似乎是一件好事,但並沒有先解決仍然存在不活動記憶體時 osx 交換的問題。

透過禁用來禁用交換動態尋呼機並重新啟動

這將強制 osx 不使用交換,以在使用所有記憶體時系統掛起的代價。不是一個可行的替代方案...

禁用交換使用被駭的動態尋呼機

與上面禁用動態分頁器類似,部落格文章評論中的一些摘錄表明這不是一個可行的解決方案:「非活動記憶體像往常一樣高」。 “當你的系統內存不足時,整個作業系統都會掛起......”,“如果你消耗了 mac 的全部內存,機器可能會掛起”

總而言之,我仍然不知道有一種方法可以在仍然存在「不活動」記憶體時停用 Mac OS X 使用交換區。如果不可能,也許至少在某個地方有一個解釋為什麼 osx 更喜歡交換內存可能隨時從記憶體中釋放

答案1

根據定義,非活動內存是準備好調出頁的內存,調出它可能涉及將其寫入交換區。這不是任何問題或需要優化的問題;事實上是OS X 按設計工作

不幸的是,技術支援作者不是核心開發人員,而且 Apple 知識庫支援文章的引用是錯誤的,它聲稱非活動記憶體是程式未使用的記憶體。當你退出一個程式時,它的所有駐留記憶體都變成空閒的;它不會停留在非活動狀態。然而,第二個鏈接開發者網站如果完整閱讀,描述記憶體管理如何運作是一個很好的資源。

對於 OS X 中「非活動記憶體」的含義存在許多誤解。事實上,如果最近訪問過活動內存,那麼它也可以被快取或清除。許多不活動的記憶體還包含不能簡單丟棄的資料。如果它被丟棄,程式就會崩潰,因為被丟棄的頁面將包含有效資料(正如 OS X 開發者方面的引述所述),而程式希望它們儲存在(虛擬)記憶體中的資料不會消失。

非活動記憶體包含與活動記憶體相同類型的資料。唯一的區別是 OS X 注意到某些記憶體區塊有一段時間沒有被讀取或寫入。

OS X 將某些記憶體分類為不活動而將其他區域分類為「活動」的原因與調出有關。當記憶體不足時,您將不得不調出一些資料。問題是,哪些數據?如果您將程式結果立即需要的資料調出頁面,那麼它會浪費時間並且一無所獲。因此,您希望調出程式不會立即需要再次使用的記憶體。

預測將來可能不需要哪些頁面很困難,因為程式可以隨心所欲地使用其虛擬內存,並且不會告訴作業系統任何有關其計劃的資訊。但作為一種啟發,大多數程式的記憶體使用都是「黏性的」。如果他們有一段時間沒有使用某塊內存,他們很可能會繼續不使用該內存,並且可能會繼續使用他們最近使用過的內存。

因此,當作業系統決定調出某些資料時,它會採取交換最近未使用的頁面的策略。這就是為什麼 OS X 將程式佔用的記憶體分為「活動」和「非活動」兩堆。這上面發布的連結如果完整閱讀,開發者網站會告訴您該過程是如何發生的:

  • 當記憶體開始變低時,作業系統開始遍歷活動記憶體頁面,並在每個頁面上設定一個標誌。
  • 如果程式讀取或寫入頁面,則該標誌會被清除。
  • 如果經過一段時間的延遲後,該標誌沒有被清除,那麼該頁面就會被分類到「非活動」堆中。
  • 如果「非活動」頁面被其程式訪問,它將被放回「活動」堆中。
  • 當記憶體耗盡時,「非活動」頁面將被換出。

請注意,決定換出哪些記憶體的排序過程在所有現代作業系統中都是類似的。 Linux 具有相同的兩個活動頁面和非活動頁面列表,如中所述了解 Linux 虛擬記憶體管理器。 Windows 可能會使用一些不同的東西來表示超過兩類新近度;我目前找不到最新的、可靠的技術描述。更多實現在維基百科頁面上討論,標題為《頁面替換演算法》。與 OS X 的唯一區別是統計數據的顯示方式:有人認為在top「活動監視器」中顯示活動和非活動的單獨數字是個好主意。回想起來,這可能不是一個好主意(這在 OS X 10.9 中已經改變。)

設定和清除標誌以及維護活動/非活動堆的過程確實需要一點處理器能力。因此,當有大量可用記憶體時,OS X 不會執行此操作。因此,您啟動的第一個程式將顯示為所有“活動”內存,直到可用內存開始不足。

因此,當您從空白開始並打開越來越多的程式時,您可以期望在活動監視器中看到以下進展:

  • 首先,有大量的“空閒”內存,並且很少有不活動的內存。這是因為記憶體標記器尚未開始運作。
  • 隨著可用記憶體量的下降,OS X 將開始運行其記憶體標記器,您將開始看到「不活動」的記憶體量不斷上升。每個「不活動」位之前都是「活動」的。
  • 當您用完可用記憶體時,「非活動」堆中的頁面將被換出。記憶體標記器也將全速運行,將記憶體分類為活動記憶體和非活動記憶體。通常,在寫入交換時,您會看到很多“不活動”,這表示記憶體標記器正在執行其應該執行的操作。

頁數必須在被換出之前被歸類為非活動狀態。這就是蘋果開發者網站上引用的意思:“這些頁麵包含有效數據,但可能隨時從內存中釋放。”這與活動頁面相反,活動頁面只有在降級為非活動狀態後才會釋放。釋放頁面的方式有很多種;如果該頁面是從文件映射的並且未被修改,則可以立即將其刪除並根據需要重新讀取。類似地,如果它是先前被換出並且自換入後未修改的內存。是如果重新建立該資料需要花費大量時間。

因此,請查看活動監視器中的「非活動」內存量,並在電腦寫入交換時同時看到大量非活動內存,只能告訴您系統正在按設計運行。

非活動記憶體和檔案快取之間也存在混淆。我不確定為什麼會出現這種混亂,因為活動監視器已經將它們列在單獨的標題下。快取是用於儲存最近從檔案系統讀取或寫入的資料的內存,以備需要再次存取時使用。當記憶體不足時,OS X 確實傾向於首先刪除快取。如果你有交換抖動,並且活動監視器顯示一大堆快取(不是不活動的),那麼會是一個問題。但不活躍的記憶是另一回事。

如果有疑問,請忽略「不活動」和「活動」之間的差異。將它們視為“程式使用的記憶體”的一團,並將這兩個數字相加。這就是其他作業系統在告訴您記憶體使用情況時所做的事情。

OS X 10.9 的注意事項:Mavericks 引入了“記憶體壓縮”,這或多或少是另一層交換。活動頁面現在被分類為非活動頁面,然後進行壓縮(根據您使用的工具,這可能會顯示為內核記憶體),然後隨著記憶體使用量的增加寫入交換區。 Mavericks 也停止在活動監視器中顯示活動和非活動的單獨數字,因為事實證明它並不是一個有用的東西,特別是考慮到圍繞它的誤解。

答案2

目前沒有簡單的方法來調整 macos X 的 swappiness(或所謂的)行為。

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 中的有線記憶體與活動內存

答案3

這不是一個永久的解決方案,但至少它可以幫助回收一些不活動的內存,從而可能避免可怕的交換:http://itunes.apple.com/nz/app/freememory/id460931672?mt=12

該工具是免費的並且非常易於使用。啟動後,在系統工具列/選單中選擇“釋放記憶體”選項。

與 ActivityMonitor 內存顯示不同,它僅顯示可用內存,這似乎可以更好地指示交換是否正在進行。

答案4

我敢打賭這個問題沒有正確答案。這與當您讓 Mac 進入睡眠狀態時仍保持活動狀態的記憶體相同,它只會隨著您的每次睡眠而不斷增長。

從「有趣」(又稱昂貴)的角度來看,您可以升級記憶體或用 SSD 取代 HDD,因此交換不會影響效能。我選擇了第一個選項,因為 Corsair 記憶體現在價格合理。

16GB內存

相關內容