Как отключить Mac OS X от использования подкачки, когда еще есть «Неактивная» память?

61

Распространенное явление в моем повседневном использовании (и некоторых других согласно различным постам в Интернете) OS X, система, кажется, замедляется, когда больше нет «свободной» доступной памяти. Предположительно, это происходит из-за подкачки, так как высокая активность на диске очевидна и что vm_stat сообщает о множестве выгрузок страниц. (Поправь меня от неправильного)

Тем не менее, количество «Неактивных» оперативной памяти обычно составляет около 12,5% -25% от всей доступной памяти (^ 1.), Когда перестановка начинается / происходит / заканчивается.

Согласно http://support.apple.com/kb/ht1342 :

Неактивная память

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

Например, если вы используете Почту, а затем выходите из нее, ОЗУ, которое использовала Почта, помечается как Неактивная память. Эта неактивная память доступна для использования другим приложением, как и Свободная память. Однако если вы откроете 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, но, несмотря на то, что ОП повторно задали основной вопрос, ни один из ответов не дает ответа на него ...

^ 1. ОБНОВЛЕНИЕ 17 марта 2012 С тех пор, как я впервые опубликовал этот вопрос, я перешел с 4 ГБ на 8 ГБ установленного ОЗУ, и проблема остается. Количество «Неактивного» оперативной памяти раньше составляло 0,5–1,0 ГБ и теперь обычно составляет около 1,0–2,0 ГБ, когда перестановка начинается / происходит / заканчивается, т. Е. Кажется, что около 12,5% -25% оперативной памяти сохраняется как неактивный с помощью 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- день :

Как только вся ваша память будет использована (свободной памяти будет 0), ОС запишет неактивную память в файл подкачки, чтобы освободить место в активной памяти.

ОБНОВЛЕНИЕ 17 марта 2012

Вот обзор методов, которые были предложены, чтобы помочь до сих пор:

Продувка команда

«Используется для аппроксимации начальных условий загрузки буферным кешем холодного диска для анализа производительности. Это не влияет на анонимную память, выделенную через malloc, vm_allocate и т. Д.».

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

Приложение FreeMemory и / или Восстановление прав доступа к диску для принудительного освобождения памяти

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

Ускорение выделения подкачки с использованием dynamicpagerwrapper

Кажется, что это хорошая вещь, чтобы ускорить использование подкачки, но не решает проблему подмены osx в первую очередь, пока есть неактивная память.

Отключение подкачки путем отключения динамического пейджера и перезапуска

Это заставит osx не использовать своп к цене зависания системы при использовании всей памяти. Не жизнеспособная альтернатива ...

Отключение свопа с помощью взломанного динамического пейджера

Подобно отключению динамического пейджера выше, некоторые выдержки из комментариев к сообщению в блоге указывают на то, что это не является жизнеспособным решением: «Неактивная память, как обычно, высока». «когда вашей системе не хватает памяти, вся ОС зависает ...», «если вы используете весь объем памяти Mac, машина, скорее всего, зависнет»

Подводя итог, я до сих пор не знаю, как отключить Mac OS X от использования подкачки, когда память все еще неактивна. Если это невозможно, может быть, где-то есть объяснение, почему osx предпочитает выгружать память, которая может быть освобождена из памяти в любое время ?

Мотин
источник
1
У меня есть эта проблема, проиллюстрированная этими номерами Activity Monitor: bassistance.de/i/f2322d.png Едва ли свободная память, но много неактивной памяти. Вместо того, чтобы исправлять это, OSX предпочитает интенсивно менять местами, как вы можете видеть по 40 ГБ страниц.
Йорн Зафферер
У меня много свободной памяти, и все еще используется несколько ГБ подкачки. 16 ГБ rMBP.
Стивен Лу
1
по-видимому, некоторые люди сообщали о преимуществах запуска «purge» apple.stackexchange.com/questions/67031/… неотрицательно
rogerdpack

Ответы:

19

По определению, неактивная память - это память, которая готова к выгружению, и подкачка может включать запись в своп. Это не какая-либо проблема или проблема, которая должна быть оптимизирована; это на самом деле 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 не делает этого, когда есть много свободной памяти. Таким образом, первые запущенные вами программы будут отображаться как вся «активная» память, пока свободная память не начнет исчерпываться.

Таким образом, начиная с чистого листа и открывая все новые и новые программы, вы можете ожидать увидеть следующий прогресс в Activity Monitor:

  • Во-первых, много «свободной» памяти и очень мало неактивных. Это потому, что флаггер памяти не запустился.
  • Когда количество свободной памяти падает, OS X начнет запускать свой маркер памяти, и вы увидите, как увеличивается количество «неактивных». Каждый бит «неактивный» ранее был «активным».
  • Когда у вас заканчивается свободная память, страницы из «неактивной» стопки будут выгружены. Память-флаггер также будет работать в режиме полного наклона, сортируя память по активным и неактивным. Как правило, вы видите много «неактивных» во время записи подкачки, что указывает на то, что флагер памяти делает то, что должен.

Страницы должныбыть классифицированным как неактивный, прежде чем они будут заменены. Вот что означает цитата с сайта Apple Developer, когда говорится: «Эти страницы содержат достоверные данные, но могут быть освобождены из памяти в любое время». Это противоречит Активным страницам, которые не будут выпущены, пока они не будут понижены до Неактивных. Существуют различные способы выпуска страниц; если страница была отображена из файла и не была изменена, ее можно немедленно удалить и повторно прочитать по требованию. Аналогично, если это память, которая ранее была заменена и не изменена с момента ее замены. Программы также могут явно выделять кэш и очищаемую память для хранения данных, которые могут быть забыты и воссозданы по требованию (но причина, по которой программа выделяет кеш если для восстановления этих данных требуется значительное время.

Поэтому анализ количества «неактивной» памяти в Activity Monitor и обнаружение большого количества неактивных данных в то время, когда компьютер записывает данные подкачки, говорит только о том, что система работает так, как задумано.

Существует также путаница между неактивной памятью и файловым кешем. Я не уверен, почему есть такая путаница, потому что Activity Monitor уже перечисляет их под отдельными заголовками. Кэш-память - это память, используемая для хранения последних данных, которые были прочитаны или записаны из файловой системы, в случае необходимости повторного доступа к ним. Когда памяти мало, OS X стремится сначала избавиться от кеша. Если у вас есть переключение свопа, а монитор активности показывает большую кучу кеша (НЕ неактивна), тогда это будет проблемой. Но неактивная память это другое дело.

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

ПРИМЕЧАНИЕ для OS X 10.9: Mavericks ввел «сжатие памяти», которое, более или менее, представляет собой еще один уровень подкачки. Активные страницы теперь классифицируются как неактивные, затем сжимаются (что может отображаться как память ядра в зависимости от того, какие инструменты вы используете), а затем записываются в раздел подкачки по мере увеличения использования памяти. Mavericks также прекратил показывать отдельные номера для активных и неактивных в Activity Monitor, поскольку оказывается, что это бесполезная вещь, особенно с учетом неправильных представлений, окружающих ее.

сгущение
источник
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

бубу
источник
Спасибо за ваши ответы. Регулировка swappiness определенно поможет - облом, что это не легко! Что касается первой ссылки, я действительно ищу хак, который не включает в себя полное отключение swap / dynamic_pager и перезапуск, поскольку это требует слишком больших усилий для отключения использования свопа, а также оставляет систему нестабильной при приближении к низкому объему неактивной и свободной памяти. Вторая ссылка относится к проблеме постоянно растущих файлов подкачки. И хотя это важный вопрос, особенно когда у меня мало файлов подкачки, он не очень важен для моего вопроса в этой теме ...
Мотин
4

Не постоянное решение, но, по крайней мере, оно может помочь восстановить некоторую неактивную память, потенциально избегая страшного обмена: http://itunes.apple.com/nz/app/freememory/id460931672?mt=12

Инструмент бесплатный и довольно простой в использовании. После запуска выберите его «Свободная память» на системной панели инструментов / меню.

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

Йорн Зафферер
источник
Я оцениваю это приложение с вашего предложения около двух месяцев назад. Похоже, что это приложение действительно увеличивает объем «свободной» памяти с помощью различных уловок, включая агрессивное использование большого количества памяти для себя, а затем ее освобождение. Однако это приводит к тому, что тот же объем памяти, который он «освобождает», должен быть выгружен. Это значит, что это не освобождает память, а только перемещает содержимое памяти из оперативной памяти на жесткий диск. В конце концов, это вызывает много перестановок, когда я пытаюсь использовать приложения, которые были открыты при освобождении памяти, так как большая часть его виртуальной машины теперь находится в режиме подкачки. :(
Motin
@Motin, я использовал FreeMemory в течение нескольких месяцев, и он этого не делает, по крайней мере, по моему опыту. Если бы мне потребовалось обоснованное предположение (основанное на том, что я видел в Activity Monitor), разница в том, что FM сначала потребляет «активную» память, которая имеет приоритет над дисковым кешем. Он «освобождает» другую память, имея более высокий приоритет, затем освобождает собственную память. Я никогда не видел, чтобы это добавляло к обмену значительно (возможно, небольшое количество, которое выделяется, пока оно потребляет).
век
2

Начиная с OS X 10.5, в MAC OS X есть очевидные проблемы с управлением памятью. Сеть уже тогда была загромождена жалобами на значительное замедление работы системы через некоторое время. Тогда у меня была более медленная машина, Mac Mini с 1 ГБ ОЗУ, поэтому я (ошибочно) пришел к выводу, что это из-за неполноценного оборудования.

Теперь у меня 2010 MBP, Core i7, 8 ГБ оперативной памяти, двойной графический процессор. Mac OS X Snow Leopard доставляла боль, но после перехода на OS X Lion работа над некоторыми серьезными вещами на MAC стала кошмаром.

Мне наконец удалось воспроизвести проблемный сценарий, поэтому я запустил тест и записал экран в видео.

Проблема производительности MAC OS X Lion - неработающее управление памятью

Я запускаю команду tar + bzip, которая является базовым компонентом Unix, для большого количества файлов изображений в моей папке Pictures /. Непосредственно перед запуском я запускаю команду «purge», чтобы удалить неактивные / кэшированные данные программы.

На видео видно, что объем свободной памяти начинает очень быстро падать, а неактивность постоянно увеличивается. Если вы посмотрите на команду "bsdtar", она займет только фрагмент оперативной памяти, поэтому проблема не в этом процессе. Вы не можете сказать, что это утечка памяти программы, потому что тогда проблема не в неактивном ОЗУ, а в активном / проводном.

Когда объем свободной памяти упал ниже 100 МБ, я запустил некоторые приложения, такие как Safari, iPhoto и MS Word, и вы можете увидеть на видео, что запуск приложения занимает даже минуты, когда обычно (при наличии свободной оперативной памяти) он займет около 3-5 секунд, чтобы загрузить.

Я запускаю тот же сценарий и те же команды на моем Linux Centos 6, никаких проблем! Использование памяти составляет около 10-20 Мб, проблем с кешем / буфером нет.

Управление памятью в Mac OS X должно быть сильно нарушено!

egremyl
источник
2
То, что вы видите, - это системное кеширование файлов в памяти. Я согласен, что есть проблема в том, что кеш никогда не очищается ... но само кеширование (и, как следствие, рост неактивной памяти) - это нормальная и иногда полезная функция производительности.
век
Также тестовая среда далеко не стерильна. Мы не можем сказать, что делает QuickTime Player или какие-либо другие открытые программы.
chrishiestand
1

Могу поспорить, что нет правильного ответа на это. То же самое с памятью, которая остается активной, когда вы кладете свой Mac спать, она просто растет и растет с каждым сном, который вы делаете.

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

16 ГБ ОЗУ


источник
2
Имейте в виду, что SSD имеют ограниченные циклы записи. Также обратите внимание, что для твердотельных накопителей без поддержки обрезки запись в конечном итоге может быть дорогой, поскольку ячейка Flash должна быть удалена.
Волнистый краб
Можете ли вы сослаться на источник по проблеме «Сон вызывает увеличение использования памяти»?
ГордонМ
Могу ли я привести свой опыт? :) Я сделал быстрый поиск и нашел это: Discussion.apple.com/message/21624847#21624847 + Есть много тем, связанных с неактивной памяти не очищается при необходимости. Я лично видел, как после каждого сна неактивная память остается прежней и увеличивается. «Очистка» - это вариант, но я не хотел бы очищать неактивную память каждые 20 минут (держу пари, что это будет иметь место с 4 ГБ ОЗУ).
1
Твердотельные накопители @WavyCrab могут иметь ограниченные циклы записи, но нет никаких шансов, что вы когда-нибудь достигнете этого предела. Я не стал бы беспокоиться об этом, если только это не SSD для центра обработки данных. В любом случае, если вы собираетесь отключить твердотельный накопитель из-за чрезмерной записи, вы скорее всего отключите жесткий диск.
andreadi