Многие люди используют скрипт ps_mem.py , чтобы узнать, сколько оперативной памяти используют процессы. В этом случае результат сценария был примерно таким:
---------------------------------
278.4 MiB
=================================
Итак, вся система использует 278,4 МБ, но бесплатно
говорит совсем другое:
# free
total used free shared buff/cache available
Mem: 1.8G 756M 980M 57M 131M 1.0G
Swap: 2.5G 11M 2.5G
Total: 4.3G 767M 3.4G
Итак, здесь система использует 756 МБ. Дело не в кеше и не из-за файлов tmp.
Я также пробовал:
# echo "3" > /proc/sys/vm/drop_caches
, чтобы увидеть, будет ли разница, но ничего не изменилось.
Так как освободить страницы, которые были взяты по какой-то причине? Я понятия не имею, что и почему использует это пространство, и не знаю, как его восстановить. На данный момент единственный вариант - перезагрузить машину.
Вот фото, где видно, какие процессы остались. Можете ли вы на основании этого объяснить использование ОЗУ?
Из-за сложности управления виртуальной памятью (все это на пользу использования наименьшего возможного объема) практически невозможно определить, сколько оперативной памяти фактически используется. См. ссылку .
Итак, что бы ни сообщал ваш скрипт python, он не будет отражать фактическое состояние.
То, что кэшируется, на самом деле бесплатно, не беспокойтесь об этом (удаление кешей на самом деле ничего не освобождает, это просто сбрасывает страницы, которые ядро могло бы повторно использовать, если бы они ему понадобились).
Бесплатные отчеты - это то, что ядро знает о системе.Это не может быть неправильным, поскольку именно ядро обслуживает память. Но он не равен сумме используемой памяти каждого отдельного процесса из-за различных механизмов: общая память (библиотеки), память с копированием при записи (после разветвления фактически дублируются только затронутые страницы), неинициализированная (обнуленная) out) страницы, загруженный программный код (также совместно используемый), виртуальная память, не соответствующая ОЗУ, выгруженные страницы, межпроцессная разделяемая память, память ядра (зарезервированная модулями ядра), память ядра (само основное ядро, включая таблицу страниц), и так далее ...
Дело в том ... если ядро сообщает о страницах как об использованных, они должны быть использованы для чего-то. Если вы хотите освободить некоторую память, она должна откуда-то поступать: каждый запущенный процесс, модуль и само ядро могут иметь механизмы для высвобождения некоторой памяти, которая может им не понадобиться сейчас и будет перезагружена позже (это зависит от разработчиков приложений, если они увидят необходимость реализации необходимой сложности для этого). Но ядро позаботится об этом, если вам действительно понадобится новая память. Он удалит кеш файловой системы, если вы запросите больше памяти, он будет подталкивать устаревшие страницы для обмена, если вы его используете, если вы используете zram или что-то в этом роде, вместо этого он сжимает страницы ... и в конце, если вы действительно не хватает места, убийца OOM найдет что-нибудь убить, чтобы предотвратить блокировку системы. Но этот процесс слишком сложен, чтобы вы думали, что знаете лучше, чем то, что происходит внутри.