Как FreeBSD выделяет память?

9

Я знаю , что это упрощенный / обобщенное объяснение, но top(1)утилита делит память на FreeBSD в шесть Бассейны- Active, Inactive, Wired, Cache, Buffersи Free. Пример из top(1)вывода:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Activeиспользуется запущенными процессами и Wiredиспользуется в основном для ядра. Inactiveявляется памятью из закрытых процессов, которая все еще кэшируется на случай, если ее необходимо использовать повторно, Cacheэто кэшированные данные, Buffersдисковые буферы (я думаю, что это похоже на вывод cachedв Linux free(1)(?)) и Freeполностью неиспользуемая память. Я правильно , что FreeBSD ядра автоматически выделяет пространство из Inactive, Cacheи Buffersпулов на Activeили в Wiredслучае необходимости?

Мартин
источник

Ответы:

13

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

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

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

Свободная память определенно свободна.

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

Буфер используется в качестве кэша большинством файловых систем (UFS, FAT, ...) и представляет собой объем памяти, используемый файловыми системами. Может быть активным, неактивным или проводным.

ARC (Adaptive Replacement Cache) - это кэш, используемый ZFS, и это память, которая может быть освобождена при необходимости.

Из FreeBSD Wiki о памяти

Классы памяти

активный

  • Содержит страницы "активно" (недавно), на которые ссылается пользователь
  • Содержит смесь чистых и грязных страниц
  • Страницы регулярно сканируются демоном страницы (каждая страница посещается один раз каждые vm.pageout_update_period секунды)
  • Сканирование проверяет, была ли ссылка на страницу с момента последнего сканирования.
  • Если достаточное количество сканирований завершено без ссылки, страница перемещается в неактивную очередь
  • Реализует псевдо-LRU

Неактивный

  • Содержит страницы, устаревшие из активной очереди
  • Содержит страницы, исключенные из буферного кеша
  • Содержит смесь чистых и грязных страниц
  • Страницы сканируются демоном страниц (начиная с заголовка очереди), когда существует нехватка памяти:
    • Страницы, на которые имеются ссылки, перемещаются обратно в активную очередь или в конец неактивной очереди.
    • Грязные страницы перемещаются в конец очереди на стирку
    • Чистые страницы без ссылок могут быть немедленно освобождены и использованы повторно
  • Реализует второй шанс LRU

Прачечная

  • Очередь для управления грязными неактивными страницами, которые необходимо очистить («отмыть»), прежде чем их можно будет повторно использовать
  • Управляется отдельной веткой, стиркой, а не страницей демона
  • Нить для стирки стирает небольшое количество страниц, чтобы сбалансировать неактивные и стирочные очереди
  • Частота отмывания зависит от:
    • Сколько чистых страниц освобождает демон страницы; Чем больше свобод, тем выше частота отмывания
    • Размер очереди на стирку относительно неактивной очереди; если очередь за прачечной растет, мы будем чаще стирать
  • Сканирование страниц осуществляется стиркой (начиная с заголовка очереди):
    • Страницы, на которые ссылались, перемещаются обратно в активную очередь или в конец очереди на стирку
    • Грязные страницы отмываются, а затем перемещаются близко к заголовку неактивной очереди

Бесплатно

  • Память доступна для использования остальной частью системы.

Проводная

  • Нестраничная память: не может быть освобождена, пока владелец не освободит ее явно
  • Пользовательская память может быть подключена с помощью mlock (2) (в зависимости от ограничений системы и пользователя)
  • Распределители памяти ядра возвращают проводную память
  • Содержимое ARC и буферного кэша являются проводными
  • Некоторая память постоянно подключена и никогда не освобождается (например, сам файл ядра)

Из раздела «Разработка и реализация операционной системы FreeBSD», глава 6.12 «Замена страницы» (не совсем точная, но здесь для справки по старому вопросу):

Ядро делит основную память на пять списков:

  1. Проводной : проводные страницы заблокированы в памяти и не могут быть выгружены. Обычно эти страницы используются ядром или пейджером физической памяти, или они заблокированы с помощью mlock . Кроме того, все страницы, используемые для хранения стеков потоков загруженных (то есть не выгруженных) процессов, также являются проводными.
  2. Active : активные страницы используются одним или несколькими областями виртуальной памяти. Хотя ядро ​​может их выгружать, это может привести к тому, что активный процесс снова откажется от них.
  3. Неактивные : неактивные страницы могут быть грязными и иметь содержимое, которое все еще известно, но они обычно не являются частью какого-либо активного региона. Если содержимое страницы загрязнено, содержимое должно быть записано в резервное хранилище перед повторным использованием страницы. После очистки страницы она перемещается в список кеша. Если системе не хватает памяти, демон выгрузки может попытаться переместить активные страницы в неактивный список в надежде найти страницы, которые на самом деле не используются. Критерии выбора, используемые демоном выгрузки для выбора страниц для перемещения из активного списка в неактивный, описаны далее в этом разделе. Когда списки свободной памяти и кеша уменьшаются до минимума, демон выгрузки просматривает неактивный список, чтобы создать больше кеша и свободных страниц.
  4. Кэш . Кэш-страницы содержат все еще известное содержимое, но они не являются частью отображения. Если они включены в активную область, они не являются частью какого-либо отображения. Если они повреждены в активной области, они будут перемещены из списка кэша в активный список. Если они используются для чтения или записи, они сначала будут перемещены из списка кеша в кеш буфера и в конечном итоге выведены в неактивный список. MLOCK системный вызов может вернуть страницу из списка кэша и подключить его. Страницы в списке кэша похожи на неактивные страницы, за исключением того, что они не являются грязными, либо потому, что они не изменены, так как они были перемещены в страницу, или потому что они были записаны в их резервное хранилище. Они могут быть востребованы для нового использования, когда требуется страница.
  5. Бесплатно : бесплатные страницы не имеют полезного содержимого и будут использоваться для выполнения новых запросов о сбоях страниц.

Чтобы ответить на ваш оригинальный вопрос

Верно ли, что ядро ​​FreeBSD автоматически распределяет пространство между пулами Inactive, Cache и Buffers для Active или Wired, если это необходимо?

Активные страницы могут стать неактивными, если они не использовались в течение некоторого времени. Если ядро ​​заменяет неактивную страницу, эта страница перемещается в список кеша . Страница в списке кэша не является частью виртуального отображения какого-либо процесса, но может быть легко восстановлена, как активная или проводная . Или когда это необходимо для ввода-вывода в качестве буферного кэша.

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

Активная , неактивная и проводная память может быть освобождена процессом или ядром и добавлена ​​в свободный список.

Рафаэль Аренс
источник
Я только что заметил ошибку в своем первоначальном вопросе. Я спросил : «Могу ли я правильно , что FreeBSD ядро автоматически выделяет пространство из Inactive, Wired, Cacheи Buffersпулов Activeили , Wiredесли это необходимо?» в то время как я хотел спросить «Могу ли я правильно , что FreeBSD ядро автоматически выделяет пространство из Inactive, Cacheи Buffersбассейны с Activeили Wiredпри необходимости?». Я обновил свой начальный вопрос. Таким образом , в двух словах, используемых в памяти FreeBSD является Wired+ , Activeи если эти два бассейна необходимо дополнительное количество памяти , то это берется из Inacative, Cached, Buffersили Freeбассейнов?
Мартин
@ Мартин да, это звучит правильно. Я обновил свой ответ на ваш вопрос.
Рафаэль Аренс