Подтвердить что ты не робот

Как надежно измерить доступную память в Linux?

Linux /proc/meminfo показывает статистику использования памяти.

MemTotal:      4040732 kB
MemFree:         23160 kB
Buffers:        163340 kB
Cached:        3707080 kB
SwapCached:          0 kB
Active:        1129324 kB
Inactive:      2762912 kB

Между ними существует довольно много перекрытий. Например, насколько я понимаю, может быть активный кеш страниц (относится к "кешированным" и "активным" ) и неактивным кэшам страницы ( "неактивный" + "кешированный" ).

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

Сначала я был склонен использовать "свободный" + "неактивный", но "бесплатная" утилита Linux использует "свободный" + "кешированный" на своем "буферизованном" дисплее, поэтому мне любопытно, какой лучший подход есть.

Когда в ядре заканчивается память, каков приоритет отбрасываемых страниц и что является более подходящей метрикой для измерения доступной памяти?

4b9b3361

Ответ 1

Поскольку то, что "доступная память" точно означает, зависит от вашей цели, и ваша цель - избегать ситуаций OOM:

Откажитесь от как Qt Extended (ранее Qtopia) ожидает ситуации OOM.

Есть два события:

  • (MemFree + Buffers + Cached)/MemTotal < treshold (в /proc/meminfo)
  • Основные страницы_файлов > treshold (pgmajfault in /proc/vmstat Я думаю)

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

Ответ 2

Сначала я нашел ваш вопрос простым, так как на практике вывод из free в столбцах "+ buffers/cache" является тем, который я использую, и он обычно работает.

Но одна из ситуаций, в которых она не работает, - это когда вы тяжело читаете те же блоки. Например. чтение одного и того же 1 gb_file снова и снова:

while true; do cat 1gb_file >/dev/null; done

Если ваша система имеет > 1 ГБ кеш, это будет работать быстро. Но если вы начнете использовать часть этого кеша для чего-то еще, это приведет к разрушению производительности системы.

Итак, когда вы оцениваете свои решения, попробуйте вышесказанное и посмотрите, учитывает ли это решение.

Ответ 3

Я бы сказал, что трудно измерить, какие страницы при удалении могут привести к "существенному влиянию системы на общую производительность системы". Страницы, используемые пользовательскими процессами, будут (Total) - (Free + Cached + Paged). Второй термин - это вся память, которую ядро ​​может освободить, если потребуется. Однако освобождение страниц памяти, используемых для кеша и страниц, окажет существенное влияние на общую производительность системы.

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

Ответ 4

Я использую следующее:

FREE_KB = MemFree + Buffers + Cached

FREE_KB=$(($(echo `sed -n '2p;3p;4p' <  /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /+/g")))


USED_KB = MemTotal - MemFree - Buffers - Cached

USED_KB=$(($(echo `head -n4 /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /-/g")))

Ответ 5

Из linux-3.14 появляется новая метрика MemAvailable в /proc/meminfo.

И проверьте строку '-/+ buffers/cache:' в выводе бесплатной утилиты.