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

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

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

Однако объем «неактивной» оперативной памяти обычно составляет около 12,5%–25% от всей доступной памяти (^1.) при запуске/происхождении/завершении подкачки.

В соответствии сhttp://support.apple.com/kb/ht1342:

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

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

Например, если вы использовали Mail, а затем вышли из него, оперативная память, которую использовала Mail, помечается как неактивная память. Эта неактивная память доступна для использования другим приложением, как и свободная память. Однако, если вы откроете Mail до того, как ее неактивная память будет использована другим приложением, 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/что-это-значит-если-у-меня-много-неактивной-памяти-в-конце-рабочего-дня:

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

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

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

Theудалятькоманда

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

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

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

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

Ускорение распределения свопов с помощьюdynamicpagerwrapper

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

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

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

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

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

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

решение1

По определению, неактивная память — это память, готовая к выгрузке, а ее выгрузка может включать запись в файл подкачки.Это не проблема.или проблема, которую следует оптимизировать; на самом деле этоOS X работает как задумано.

К сожалению, авторы технической поддержки не являются разработчиками ядра, и цитата из статьи поддержки Apple Knowledge Base просто неверна, когда утверждает, что неактивная память — это память, не используемая программами. Когда вы выходите из программы, вся ее резидентная память становится свободной; она не останавливается в состоянии неактивности. Однако вторая ссылка насайт разработчикаОписание того, как работает управление памятью, является полезным ресурсом, если его прочитать полностью.

Существует множество заблуждений о том, что означает «неактивная память» в OS X. Вопреки заблуждениям, не вся неактивная память пуста, не используется, кэширована или может быть очищена. Фактически, активная память может быть кэширована или очищена, если к ней недавно обращались. Большая часть неактивной памяти также содержит данные, которые нельзя просто сбросить. Если бы она была сброшена, программы бы вылетали, потому что сброшенные страницы содержали бы действительные данные (как гласит цитата со стороны разработчика OS X), а программы ожидают, что данные, которые они сохранили в (виртуальной) памяти, просто не исчезнут.

Неактивная память содержит те же типы данных, что и активная память. Единственное отличие в том, что OS X заметила, что некоторые фрагменты памяти не считывались и не записывались некоторое время.

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

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

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

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

Обратите внимание, что этот процесс сортировки для определения того, какую память следует выгрузить, аналогичен во всех современных операционных системах. Linux имеет те же два списка активных и неактивных страниц, как описано вПонимание диспетчера виртуальной памяти Linux. Windows может использовать что-то немного другое с более чем двумя классами новизны; я не могу найти недавнее, надежное техническое описание на данный момент. Больше реализаций обсуждаются на странице Википедии под названием«Алгоритм замены страницы». Единственное отличие от OS X заключалось в том, как отображалась статистика: кто-то решил, что было бы хорошей идеей показывать отдельные цифры для активных и неактивных в topActivity Monitor. Оглядываясь назад, это, вероятно, была не такая уж хорошая идея (и это изменилось в OS X 10.9.)

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

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

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

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

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

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

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

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

решение2

В настоящее время не существует простого способа настройки поведения swappiness (или как его еще называют) в Mac OS 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

решение3

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

Инструмент бесплатный и довольно прост в использовании. После запуска выберите опцию "Освободить память" на панели инструментов/меню системы.

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

решение4

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

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

16 ГБ ОЗУ

Связанный контент