Menu

Сброс кэша в Linux

Пока в Интернете ведутся войны на тему "надо ли вообще сбрасывать кэш в Linux", я для себя ответил на этот вопрос. Да, иногда это необходимо. Предположим, есть сервер, который работает под CentOS и выполняет монотонные несложные задачи ежедневно. Но раз в неделю он единовременно выполняет весьма ресурсоёмкую задачу, которая сильно нагружает процессор и "съедает" всю память (под кэш). Конечно, грамотные люди знают, что такое буфер, и как он работает. Но смысл хранить в памяти файловые данные, которые в лучшем случае потребуются через неделю, а скорее всего - просто устареют уже через пару дней!?

Моё предложение: дополнять скрипты редких ресурсоёмких задач командами очистки кэша.

К ресурсоёмким задачам, забивающим кэш лишней информацией я отношу следующие задачи, при условии их редкого выполнения:

  • Архивация (в моём случае tar способен "съесть" всю свободную память)
  • Обновление через yum
  • Анализ статистики веб-сервера и построение отчётов

Как известно, в версии ядра 2.6.16 (и более свежих) появился механизм, который вынуждает ядро сбросить страничный кэш и/или кэши inode+dentry. После выполнения команды высвобождается существенный объем ОЗУ. Ходят легенды, что издревле несчастные администраторы писали специальные скрипты, которые пытались выделить тонны памяти с единственной целью: чтобы изгнать кэш из памяти :)

Для использования /proc/sys/vm/drop_caches достаточно передать число.

Чтобы сбросить страничный кэш:

echo 1 > /proc/sys/vm/drop_caches

Чтобы сбросить кэши dentry и inodes:

echo 2 > /proc/sys/vm/drop_caches

Чтобы сбросить страничный кэш, dentry и inodes:

echo 3 > /proc/sys/vm/drop_caches

Теперь выполним лабораторную работу.

На веб-сервере, работающем под CentOS 6.6, было замечено, что в обычном режиме достаточно 1 Гб ОЗУ для выполнения всех задач, причем этот лимит никогда не превышается, а файл подкачки постоянно держится на величине 0 Kb. Однако, после выполнения тяжелых задач память целиком забивается, и - самое обидное! - сервер начинает своппить на обычных простых задачах, постепенно забивая файл подкачки и постоянно напрягая жесткий диск. Проведём мониторинг памяти до (красным) и после (синим) выполнения сброса.

Cache Dropping

Выигрыш очевиден. Если раньше было свободно 87 Мб, то стало свободно 1456 Мб даже при условии, что в качестве параметра сброса мы передавали единицу.

Теперь сервер в состоянии проработать ещё неделю, совершенно не напрягая жесткий диск.

This is a non-destructive operation and will only free things that are completely unused. Dirty objects will continue to be in use until written out to disk and are not freeable. If you run "sync" first to flush them out to disk, these drop operations will tend to free more memory.

Авторизуйтесь, чтобы получить возможность оставлять комментарии
Go to top