Как FreeBSD распределяет память?

То, что я всегда делаю, помещается a # маркер комментария перед командой. Я могу позже вспомнить это в истории, удалить маркер комментария и затем выполнить команду.

9
09.10.2015, 15:23
1 ответ

Короче говоря, active и wired используют память, которая не должна или не может быть вытеснена для освобождения памяти. В то время как inactive может быть вытеснена, но все еще принадлежит (не освобождена) процессу или ядру, поэтому это не сильно используемая память, но все же используемая.

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

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

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

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

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

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

Из FreeBSD Wiki on Memory

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

Активная

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

Неактивная

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

Стирка

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

Свободная

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

Проводная

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

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

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

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

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

Правильно ли я понимаю, что ядро FreeBSD автоматически выделяет место из пулов Inactive, Cache и Buffers в Active или Wired, если это необходимо?

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

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

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

13
27.01.2020, 20:06

Теги

Похожие вопросы