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

22

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

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

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

Бальчев
источник
Да это странно Это одно приложение, занимающее всю оперативную память? Может быть, OSX ограничивает приложения не использовать более 80% оперативной памяти одновременно. Неактивный не означает, что его бесплатно. Это зарезервировано для чего-то.
Петр Кула
Нет - много приложений, браузеров, Eclipse и т. Д. Из того, что я читал, он бесплатный, поскольку кэш недавно закрытых приложений. Должен быть способ сделать так, чтобы OS X не менялась при неактивной памяти
Балчев
Я могу воспроизвести его в любое время и при необходимости сделать экран монитора активности
Балчев
2
Неактивная память не является свободной памятью.
kinokijuf
2
@kinokijuf, однако, он должен действовать как свободная память, когда свободной памяти не осталось. Если неактивная память всегда выгружается на диск, нет никакого смысла проводить различие между активным и неактивным.
Питер

Ответы:

18

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

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

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

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

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

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

Также учтите, что замена (запись на диск) обходится дороже, чем замена (чтение с диска). Что делает эту «ставку» еще более непривлекательной.

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


Обновление: выясняется, что неактивная память не работает, так как Использование Activity Monitor для чтения статьи System Memory заставило многих поверить, что она работает. В статье дано правильное определение неактивной памяти:

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

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

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

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

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

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

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

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

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

M000
источник
1
Привет, не уверен, что вы меня понимаете - я говорю о том моменте, когда у вас есть 100-200 МБ свободной памяти, 2,6 ГБ "неактивно" и запускается другая программа, скажем, eclipse, xcode и т. Д. Что происходит, когда он не использует эти 2,6 ГБ и вместо этого свап из активной памяти. Не уверен, что вы понимаете, о чем я. Во всяком случае, спасибо за ваш ответ
Балчев
Это ясно сейчас. Может быть, вы должны добавить пример в этом комментарии к вашему вопросу. Я добавил дополнительную информацию, которая, я думаю, дает адекватное объяснение того, что вы наблюдаете.
m000
Не уверен, что я отредактирую свой оригинальный ответ. Это объясняет другой случай (поскольку я не получил ваш вопрос прямо перед вашим комментарием) и может сбить с толку людей.
m000
Как говорит Раду в своем комментарии, «OS X - голодный зверь». Я не ожидал, что OS X будет настолько требовательна к памяти (как Lion, так и сейчас Mountain Lion), и поэтому я подумал, что здесь есть что-то подозрительное. Спасибо за ваш обновленный ответ.
Балчев
6

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

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

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

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

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

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

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
arundevma
источник
Я прочитал в сети, что отключение подкачки на OSX может привести к неожиданному поведению системы и сбоям. Это правда?
Балчев
Когда ваша память низка, это будет. Но если у вас достаточно памяти, например, 8 Гб, это не вызовет никаких проблем.
Арундевма
2
«Достаточно памяти, как 8 Гб» - извините, это так мило… :)
Bombe
0

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

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

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

источник
Привет, я использовал команду очистки, но большую часть времени он освобождает менее половины «неактивной» памяти. Я читал, что отключение подкачки на OSX может привести к неожиданному поведению системы и сбоям. Итак, я пошел с 1) Теперь все в порядке с 16 ГБ :) Просто этот объем памяти используется для серверов, а не настольных компьютеров :) Спасибо за ваш ответ
Балчев
У меня есть 16 ГБ на моем MacBook Pro, это не сервер. :) Хорошо известно, что OS X - голодный зверь, когда дело доходит до памяти, особенно когда одновременно используются несколько средних / больших приложений. Мне удалось заполнить все эти 16 ГБ, не открывая никакого программного обеспечения для редактирования изображений / видео, только некоторые игры и небольшие приложения. Объем неактивной памяти был около 4 ГБ ...
Вы также должны принять во внимание, что многие из приложений OS X уже 64-битные. 64-битные приложения выделяют больше памяти, чем 32-битные, из-за увеличения адресного пространства.
0

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

Дэвид Шварц
источник
1
это плохо спроектировано тогда. он слишком агрессивен в распределении и использовании пространства подкачки.
Мендота
Почему это имеет значение? Если есть много свободного обмена, выделение пространства подкачки безвредно. Это особенно верно, когда своп не содержит необходимых данных, потому что удаление выделений не требует затрат. Это хороший дизайн - выполнять тяжелую работу, когда она практически бесплатна, а не откладывать ее на потом, когда система находится под давлением.
Дэвид Шварц
2
плохой дизайн, когда он слишком агрессивен и вызывает заикание или зависания в программах, он ошибочно помечается как неактивный и начинает переходить в режим подкачки. тем временем в ОЗУ есть еще восемь свободных концертов: /
mendota
Я согласен с Мендотой. После того, как я полностью отключил своп, моя система работает без сбоев.
Антон Кузьмин
@AntonKuzmin Это действительно не имеет никакого отношения к тому, о чем этот вопрос. Если вы читаете этот вопрос, он вообще ничего не говорит о заикании или каких-либо проблемах.
Дэвид Шварц