доступная память в ядре


Существует ли функция ядра, которая возвращает объем доступной памяти ядра (не связанной с vmalloc).

2 3

2 ответа:

Во-первых, позвольте мне сказать, что если вы собираетесь принимать какие-либо политические решения (должен ли я продолжать эту операцию?) основываясь на этой информации, остановитесь. Как указала WGW, здесь неизбежны гонки; память может быть использована между тем, когда вы проверяете и когда вы ее используете. Просто проверьте наличие ошибок при выделении памяти и выберите соответствующий путь сбоя. Более того, если вы запросите память, когда свободной памяти недостаточно, ядро может получить больше свободной памяти, очистив ее. различная кэш-память, замена на диск, освобождение плит и т. д. И фрагментация памяти ядра может привести к сбою больших (многостраничных) выделений, когда они не выполняются через vmalloc, даже при наличии большого количества свободной памяти.

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

Во-первых, у нас есть si_meminfo . Это вызов, который предоставляет данные о доступности для /proc/meminfo, среди прочего, и отчеты о текущем состоянии распределителя страниц приятеля. Обратите внимание, что кэшированная и буферная оперативная память может быть преобразована в свободную оперативную память очень быстро.

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

Распределитель SLUB (используется для kalloc() и тому подобного, среди прочих) также предоставляет статистику для своих внутренних пулов памяти, которая также может отражать свободную память в каждом пуле памяти. Это может быть недоступно с одним и тем же API в зависимости от того, какой распределитель выбран в вашей конфигурации - пожалуйста, Не используйте эти данные, за исключением отладки. Соответствующий код (реализующий /proc/slabinfo) можно найти в mm/slub.c

Как вы используете доступную вам память? В худшем случае вы бежите в состоянии гонки с проверкой доступной памяти:

  1. Вы получаете доступную память. Этого достаточно.
  2. Многозадачность, то есть планировщик ядра, останавливает ваш процесс и продолжает другой, который выделяет кучу доступной памяти.
  3. планировщик продолжает ваш процесс.
  4. ваши выделения завершаются неудачей, хотя Шаг 1 показал достаточно доступной памяти.