Вопрос или проблема
Сегодня я обнаружил, что на моем сервере осталось совсем немного свободной памяти. Я выполнил команду free -h
, и она показала, что 60 ГБ памяти занято кешем. Поэтому я выполнил команду для освобождения кеша, результат оказался таким:
$ free -h; sudo sync; echo 3 > sudo /proc/sys/vm/drop_caches; free -h
total used free shared buffers cached
Mem: 126G 114G 11G 5.6M 465M 60G
-/+ buffers/cache: 53G 72G
Swap: 75G 607M 74G
total used free shared buffers cached
Mem: 126G 114G 11G 5.6M 465M 60G
-/+ buffers/cache: 53G 72G
Swap: 75G 607M 74G
Похоже, что кеш вообще не был освобожден, и на этом сервере нет виртуальных машин. Почему? Что мне делать, чтобы освободить кеш, кроме перезагрузки сервера (моя ОС – Debian 8)?
Спасибо!
/proc/sys/vm/drop_caches
не имеет операционного назначения. Не пытайтесь это делать, вы только ухудшите производительность. Единственное практическое применение – холодные кеши для бенчмарков.
Кеш доступен приложениям, но Linux считает его использованным. Обязательно: https://www.linuxatemyram.com/
Почему вы бы тратили деньги и ресурсы на быструю память и не использовали ее для увеличения производительности?
Хотя другие ответы правы в том, что нет причин не оставлять кеш, реальная причина, по которой вы не видели уменьшение кеша, заключается в том, что ваша команда была неправильно отформатирована: echo 3 > sudo /proc/sys/vm/drop_caches
записывает “3 /proc/sys/vm/drop_caches” в файл с именем “sudo” в текущей папке. Вместо этого выполните:
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
Одной из причин, почему drop_caches
не освобождает память, является то, что некоторые кеши все еще используются, например, файловыми системами tmpfs
(в памяти). Чтобы узнать, сколько памяти выделено для таких объектов, вы можете использовать утилиту df
:
df -t tmpfs --total -h
Эта команда выведет информацию о использовании всех tmpfs, которые сейчас используются. -t tmpfs
ограничивает список только системами tmpfs
, --total
дает общую сумму для всех перечисленных файловых систем, а -h
форматирует все размеры в человекочитаемом формате.
Проблема в том, что некоторые приложения обычно создают временные файлы, открывают их, а затем удаляют, не закрывая. В результате tmpfs не может освободить память, поскольку файлы все еще используются. Чтобы найти такие приложения, вы можете использовать эту команду:
lsof -nP +L1 /dev/shm | grep DEL
Это отобразит все открытые удаленные файлы в /dev/shm
(обычно используемая система tmpfs
), а также приложения, которые их открыли. -nP
– это оптимизация для более быстрого выполнения, +L1
ограничивает подсчет ссылок, а /dev/shm
указывает каталог для сканирования открытых файлов. Затем | grep DEL
выбирает только удаленные файлы из списка.
Chromium – одно из самых популярных программных обеспечений, которые злоупотребляют /dev/shm
для своих целей, поэтому вы можете получить несколько ГБ удаленных файлов, созданных приложениями на основе chromium или electron. И этот кеш не будет удален с помощью drop_caches
и не освободится в ситуациях с низким объемом памяти.
Ответ или решение
Почему команда /proc/sys/vm/drop_caches не освобождает кеш ОЗУ?
В вашем случае ситуация с высокими значениями используемой оперативной памяти и кеша может вызывать беспокойство, особенно если команда для освобождения кеша не дает ожидаемых результатов. Давайте разберемся в причинах этого поведения и рассмотрим возможные решения проблемы.
Понимание работы кеша в Linux
Система управления памятью в Linux использует кеш для хранения временных данных, что позволяет ускорить доступ к файлам и данным. Это нормальное поведение системы — кешированная память фактически "доступна" для приложений, несмотря на то, что она считается "используемой". Ваша команда free -h
показывает, что в системе доступно 11 ГБ свободной памяти, тогда как 60 ГБ заняты кешем. Однако эта память может быть быстро перераспределена под нужды приложений.
Команда drop_caches
Команда echo 3 > /proc/sys/vm/drop_caches
предназначена для очистки памяти кеша. Однако есть несколько важных моментов, которые могут привести к тому, что кеш по-прежнему останется на высоком уровне:
-
Неправильная команда: Ваша первоначальная команда, скорее всего, не сработала из-за неправильного формата. Чтобы правильно выполнить команду, следует использовать:
echo 3 | sudo tee /proc/sys/vm/drop_caches
-
Используемый кеш: Некоторые данные могут быть недоступны для освобождения, если они используются. Например, файлы в системе
tmpfs
могут занимать место и не освобождаться. Чтобы увидеть использование данной файловой системы, выполните:df -t tmpfs --total -h
-
Открытые и удаленные файлы: Приложения могут создавать временные файлы, открывать их и удалять, не закрывая. Эти файлы все еще занимают память. Чтобы найти такие файлы, выполните:
lsof -nP +L1 /dev/shm | grep DEL
Это покажет все открытые удаленные файлы и соответствующие приложения.
-
Кеш, сохраняемый приложениями: Некоторые популярные приложения, такие как Chromium, используют
tmpfs
для хранения временных данных, что может привести к накоплению кеша, который не освобождается даже после выполнения командыdrop_caches
.
Рекомендации по освобождению памяти
Чтобы более эффективно управлять памятью и кешем, рассмотрите следующие шаги:
- Перезапуск приложений: Перезапуск приложений, что может освободить используемую ими память.
- Удаление либо ограничение использования временных файлов: Настройте приложения для уменьшения использования временных файлов, если возможно.
- Мониторинг использования памяти: Используйте инструменты мониторинга, чтобы постоянно отслеживать использование памяти и находить проблемные приложения.
- Регулярное очищение кеша: Если все же необходимо часто очищать кеш, следует выполнить команды с учетом правильного синтаксиса.
Заключение
Хотя кеш в системе может показаться избыточным, его наличие обычно призвано улучшить производительность. Если вы уже пробовали команду и не увидели результатов, это может быть связано с другими факторами — не только с кешем. Следуя приведенным рекомендациям и внимательно отслеживая использование памяти, вы сможете поддерживать свою систему в оптимальном состоянии без необходимости в частом вмешательстве.