59

Распространенное явление в моем повседневном использовании (и некоторых других согласно различным постам в Интернете) 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

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

Команда очистки

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

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

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

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

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

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

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

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

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

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

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

5 ответов5

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

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

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

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

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

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 должно быть сильно нарушено!

1

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

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

16 ГБ ОЗУ

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .