При запуске cat /proc/meminfo
вы получаете эти 3 значения вверху:
MemTotal: 6291456 kB
MemFree: 4038976 kB
Cached: 1477948 kB
Насколько я знаю, значение "Cached" - это дисковые кэши, создаваемые системой Linux, которые будут немедленно освобождены, если любому приложению потребуется больше оперативной памяти, поэтому Linux никогда не исчерпает память до тех пор, пока MemFree и Cached не будут установлены на ноль.
К сожалению, «procAvailable» не сообщается / proc / meminfo, возможно потому, что он работает на виртуальном сервере. (Версия ядра - 4.4)
Таким образом, для всех практических целей доступной для приложений оперативной памяти является MemFree + Cached.
Это мнение правильно?
MemAvailable
, это было добавлено в 3.14.Ответы:
Эта точка зрения может вводить в заблуждение в ряде реальных случаев.
Теперь ядро предоставляет оценку доступной памяти в
MemAvailable
поле. Это значение значительно отличается отMemFree + Cached
.1. MemAvailable детали
Как сказано выше, tmpfs и другая
Shmem
память не могут быть освобождены, только перемещены для подкачки.Cached
Это/proc/meminfo
может вводить в заблуждение из-за включения этой заменяемойShmem
памяти. Если у вас слишком много файлов в tmpfs, это может занять много вашей памяти :-).Shmem
также может включать в себя некоторые выделения графической памяти , которые могут быть очень большими.MemAvailable
намеренно не включает в себя заменяемую память. Слишком большой обмен может привести к длительным задержкам. Возможно, вы даже выбрали запуск без пространства подкачки или допустили только относительно ограниченное количество.Мне пришлось перепроверить, как
MemAvailable
работает. На первый взгляд в коде, похоже, не упоминается это различие.Тем не менее, я обнаружил, что это правильно относится
Shmem
к «использованной» памяти. Я создал несколько файлов 1GB в TMPFS. Каждое увеличение на 1 ГБShmem
уменьшаетсяMemAvailable
на 1 ГБ. Таким образом, размер «списков файлов LRU» не включает общую память или любую другую заменяемую память. (Я заметил, что те же самые числа страниц также используются в коде, который вычисляет «грязный лимит» ).Этот
MemAvailable
расчет также предполагает, что вы хотите сохранить как минимум достаточное количество файлового кэша, чтобы соответствовать «низкому значению ядра» ядра. Или половина текущего кэша - в зависимости от того, что меньше. (Это делает то же самое предположение для исправимых плит также). «Низкий водяной знак» ядра может быть настроен, но обычно он составляет около 2% системной памяти . Так что если вам нужна только приблизительная оценка, вы можете проигнорировать эту часть :-).Когда вы используете
firefox
около 100 МБ программного кода, отображенного в кеше страницы, вы обычно хотите сохранить эти 100 МБ в ОЗУ :-). В противном случае, в лучшем случае вы будете страдать задержками, в худшем случае система будет тратить все свое время обмолота между различными приложениями. ТакMemAvailable
что позволяет небольшой процент оперативной памяти для этого. Это может не позволить достаточно, или это может быть слишком щедрым. «Влияние этих факторов будет варьироваться от системы к системе».Для многих рабочих нагрузок ПК вопрос о «большом количестве файлов» может быть неактуальным. Несмотря на это, в настоящее время у меня на ноутбуке 500 МБ памяти для восстановления (из 8 ГБ ОЗУ). Это связано с
ext4_inode_cache
(более 300К объектов). Это произошло потому, что мне недавно пришлось сканировать всю файловую систему, чтобы найти то, что использовало мое дисковое пространство :-). Я использовал командуdf -x / | sort -n
, но, например, Gnome Disk Usage Analyzer сделал бы то же самое.2. [править] Память в контрольных группах
Так называемые «Linux контейнеры» построены из
namespaces
,cgroups
и различных других функций по вкусу :-). Они могут предоставить достаточно убедительную среду для запуска чего-то, почти такого же, как полноценная система Linux. Хостинговые сервисы могут создавать такие контейнеры и продавать их как «виртуальные серверы» :-).Хостинговые серверы также могут создавать «виртуальные серверы», используя функции, которых нет в основной Linux. Контейнеры OpenVZ предварительно датируют основные групповые группы на два года и могут использовать «beancounters» для ограничения памяти. Таким образом, вы не можете точно понять, как работают эти ограничения памяти, если вы только читаете документы или задаете вопросы о ядре Linux.
cat /proc/user_beancounters
показывает текущее использование и ограничения.vzubc
представляет его в чуть более дружественном формате. Главная страница на beancounters документов имен строк.Контрольные группы включают в себя возможность устанавливать ограничения памяти для процессов внутри них. Если вы запустите свое приложение внутри такой группы, то не вся системная память будет доступна для приложения :-). Итак, как мы можем увидеть доступную память в этом случае?
Интерфейс для этого отличается по-разному, в зависимости от того, используете ли вы cgroup-v1 или cgroup-v2 .
Мой ноутбук устанавливает cgroup-v1. Я могу бежать
cat /sys/fs/cgroup/memory/memory.stat
. Файл показывает различные поля , включаяtotal_rss
,total_cache
,total_shmem
. shmem, включая tmpfs, учитывает ограничения памяти. Я думаю, вы можете рассматриватьtotal_rss
как обратный эквивалентMemFree
. И есть также файлmemory.kmem.usage_in_bytes
, представляющий память ядра, включая плиты. (Я предполагаю,memory.kmem.
также включаетmemory.kmem.tcp.
и любые будущие расширения, хотя это явно не задокументировано). Не существует отдельных счетчиков для просмотра памяти исправимых плит. В документе для cgroup-v1 говорится, что превышение пределов памяти не приводит к восстановлению какой-либо памяти slab. (В документе также есть заявление об отказе от ответственности за то, что оно «безнадежно устарело» и что вам следует проверить текущий исходный код).cgroup-v2 отличается. Я думаю, что корневая группа верхнего уровня не поддерживает учет памяти. У cgroup-v2 все еще есть
memory.stat
файл. Все поля суммируются по дочерним cgroups, поэтому вам не нужно искатьtotal_...
поля. Естьfile
поле, что означает то же самое, что иcache
сделал. Досадно, я не вижу общее поле, какrss
внутриmemory.stat
; Я полагаю, вам придется сложить отдельные поля. Есть отдельная статистика для исправляемой и невосстановимой памяти плиты; Я думаю, что v2 cgroup предназначена для восстановления плит, когда она начинает исчерпывать память.Linux cgroups автоматически не виртуализируется
/proc/meminfo
(или любой другой файл в нем/proc
), поэтому будут отображаться значения для всей машины. Это может запутать клиентов VPS. Однако можно использовать пространства имен для замены/proc/meminfo
файлом, подделанным конкретным программным обеспечением контейнера . Насколько полезны поддельные значения, будет зависеть от того, что делает это конкретное программное обеспечение.systemd
считает, что cgroup-v1 нельзя безопасно делегировать, например, контейнерам. Я заглянул внутрьsystemd-nspawn
контейнера в моей системе cgroup-v1. Я вижу группу, в которую она была помещена, и память об этом. С другой стороны, содержимоеsystemd
не устанавливает обычные c-группы для службы для учета ресурсов. Если учет памяти не был включен внутри этой группы, я предполагаю, что контейнер не сможет включить его.Я предполагаю, что если вы находитесь внутри контейнера cgroup-v2, он будет отличаться от корня реальной системы cgroup-v2, и вы сможете увидеть память, учитывающую ее cgroup верхнего уровня. Или, если вы видите, что в cgroup не включен учет памяти, возможно, вам будет делегировано разрешение, чтобы вы могли включить учет памяти в
systemd
(или эквивалентном).источник
git describe --contains
). Нашел, что он связан как TL; DR с помощью вопроса SU, который оказался просто цитированием раздела, добавленного в proc.txt. Но для этого вопроса описание коммита просто идеальное ИМО :-).