Почему OS X использует swap, когда есть много «неактивной памяти»?

Я использую OS X с нескольких месяцев (Lion и теперь Mountain Lion). У меня 8 Гбайт на моем мини и почти ежедневно, теперь он близок к этому. На машине с Windows 7 с 8 ГБ у меня никогда не было таких проблем. Во всяком случае, я читаю через сеть, что неактивная память – это кэш приложений недавно закрытых программ и может использоваться для более быстрого повторного открытия. И эта неактивная память может быть выпущена в новое приложение, если это необходимо. Он не выпущен. Вместо этого OS X начинает замену. Поэтому мой вопрос: почему OS X использует swap, когда есть много «неактивной памяти»? Вот экран, который показывает, что я имею в виду:

Введите описание изображения здесь

Я действительно надеюсь, что вам нужно сделать OS X, чтобы использовать эти 2,69 ГБ перед началом обмена. Я действительно это делаю.

По-видимому, замена произошла, когда фактически неактивные страницы ОЗУ были активны.

( Обновление: как было выяснено в комментарии, это не ваш случай. Поэтому люди с одинаковой проблемой могут пропустить вперед к горизонтальному правилу .)

Т.е. у вас было много запущенных программ, а ядро ​​выгружало некоторые страницы. Затем вы вышли из некоторых программ. Ядро отмечает, что их страницы RAM неактивны. Но он не будет заменять страницы в RAM до тех пор, пока эти страницы не понадобятся. Это приводит к наличию как неактивных, так и выгруженных страниц.

Почему бы не превентивно менять страницы? Потому что это будет делать ставки против разногласий: в долгосрочной перспективе вы проигрываете. Давайте рассмотрим упрощенный пример: две программы A и B, которые одновременно не вписываются в ОЗУ. Программа A по-прежнему работает, и все страницы с отсканированными данными принадлежат A. Программа B завершена, и все неактивные страницы принадлежат B.

Если ядро ​​превентивно свопирует страницы A и сразу после:

  • Программе A требуется доступ к ее страницам -> Вы выигрываете – страницы уже находятся в ОЗУ.
  • Вы снова запускаете B -> Вы проигрываете – вы «платите» за перенос страниц в ОЗУ, и теперь вам нужно их отправить.
  • Вы запускаете другую программу C -> Вы проигрываете, если A и C не подходят в ОЗУ одновременно. Если они подходят, вы даже.

Также учтите, что свопинг (запись на диск) дороже, чем замена (чтение с диска). Это делает эту ставку более непривлекательной.

Короче: доверяйте своему ядру и не пытайтесь перехитрить его.


Обновление. Оказывается, что неактивная память не работает, так как функция « Использовать монитор активности» для чтения статьи « Системная память » заставила многих людей поверить, что она работает. Правильное определение, приведенное в статье для неактивной памяти:

Эта информация находится в ОЗУ, но она не используется активно, она была недавно использована.

Но следующий пример полностью вводит в заблуждение и чрезмерно упрощен (как и мой пример, чтобы быть откровенным):

Например, если вы используете Mail, а затем выходите из нее, то RAM, которую использует Mail, помечена как неактивная память. Неактивная память доступна для использования другим приложением, подобно свободной памяти. Однако, если вы открываете почту до того, как ее неактивная память будет использоваться другим приложением, Mail откроется быстрее, потому что ее неактивная память преобразуется в активную память вместо загрузки с более медленного диска.

Я искал больше онлайн-ресурсов и попал в эту цепочку в списке рассылки ядра darwin, который довольно информативен. Цитата Джима Маги (из команды Дарвина – я думаю):

Короче говоря, система VM ядра при работе с давлением памяти сканирует страницы, используемые при использовании, и пытается сохранить баланс между активной и неактивной маркировкой. Неактивные страницы проверяются на повторное использование, пока они неактивны. Если они были повторно использованы, они помечены как активные, а другая страница должна перейти из активного состояния в неактивное, чтобы определить, активно ли оно. Таким образом, неактивное является неправильным. Это сокращение от «возможно неактивного, попробуем проверить это».

Как вы обнаружили, внутренний баланс, к которому мы (в настоящее время) стремимся, составляет приблизительно 2/3 активных против 1/3 неактивных …

Это объясняет поведение, которое вы наблюдаете. Т.е. неактивные страницы, которые вы видите, относятся к запущенным программам, которые не использовались в последнее время. Итак, когда вы запускаете новую программу, неактивные страницы заменяются. В то же время страницы из других программ отмечены как неактивные, чтобы поддерживать соотношение 2/1 активного и неактивного.

В потоке также содержатся некоторые предложения, чтобы узнать больше о внутренних компонентах darwin. Есть также некоторые предложения в случае, если вы начали расследование использования памяти из-за проблем с пляжным мячом (которые обычно имеют мало общего с этим).

Вывод остается неизменным: доверяйте своему ядру и не пытайтесь перехитрить его. 🙂

Вы можете отключить подкачку, если у вас достаточно барана.

Попробуйте эти команды.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist sudo rm /private/var/vm/swapfile* 

Затем перезапустите и убедитесь, что процесс dynamic_pager больше не запущен.

Убедитесь, что в /private/var/vm/ не было создано swapfiles.

Для повторного включения попробуйте выполнить следующие команды:

 sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist 

Вы также можете отключить Spotlight, чтобы освободить больше бара и уменьшить активность диска. Следующие команды используются для отключения и включения Spotlight.

 sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.metadata.mds.plist 

Система работает так, как она была разработана. Даже когда нет давления памяти, может возникнуть смысл писать некоторые страницы, которые нельзя отбросить, но не использовались для замены, когда система не занята. Таким образом, если есть давление памяти позже, эти страницы могут быть выведены из ОЗУ без необходимости сначала записывать их для обмена, пока система занята.

Ты мало что можешь сделать. Почему он это делает? Потому что именно так работает OS X. Интересная часть заключается в том, как занятая память становится все больше с каждым сном, который получает Mac.

Что ты можешь сделать:

  1. Обновление ОЗУ.
  2. Запустите команду « очистить », чтобы очистить большую часть неактивной памяти, когда это необходимо.
  3. Отключить своп http://osxdaily.com/2010/10/08/mac-virtual-memory-swap/
Interesting Posts

Почему термины «автоматический» и «динамический» предпочтительнее терминов «стек» и «куча» в управлении памятью C ++?

Как заставить Windows проверять наличие обновлений?

Почему переменная среды не обновляется в cmd без перезапуска?

Не удалось найти метод android () для аргументов

Можно ли изменить закрепленный значок в окнах 7?

Форматировать разблокированные ячейки с VBA в защищенном листе, но не заблокированные ячейки

Как получить ввод с клавиатуры в pygame?

Устанавливать переменную readonly в bash

Printf переменное число десятичных знаков в float

Как использовать мою собственную базу данных sqlite?

Является ли String Literal Pool набор ссылок на объект String или набор объектов

Зачем указывать @charset «UTF-8»; в вашем файле CSS?

API Java для множественных форм английских слов

UIScrollView не прокручивается после обновления до iOS7 / xcode 5

java.lang.IllegalStateException: невозможно (переслать | sendRedirect | создать сеанс) после того, как ответ был получен

Давайте будем гением компьютера.