Главная » Создание сайта, раскрутка сайта

Как ограничить файловый кэш в CentOS(Linux)?

Ядро Linux сконструировано таким образом, что память в данной операционной системе используется с расчетом на максимальную производительность всей системы. И тут стоит сравнить две памяти: медленную и быструю — оперативную память и память жесткого диска(SSD-диска). Скорость чтения/записи в оперативную память намного превышает скорость доступа к жесткому диску. А значит напрашивается вполне элементарный вывод: лучше читать из оперативной памяти, нежели тот же файл с жесткого диска. Однако учитывая ограниченное количество оперативной памяти нельзя хранить все что попало в оперативной памяти, так как главное предназначение оперативной памяти — работа с приложениями.

Как Linux(CentOS) использует оперативную память

Вернемся к конструкции Linux(CentOS), которая кэширует в оперативную память все файлы, которые были запрошены с моменты запуска компьютера. Это и называется файловый кэшем CentOS и который и является основным виновников всех криков и ругательств по поводу того, что Linux съел всю вашу оперативную память. Разумеется, с переполнением оперативной памяти малоиспользуемые файлы будут выкинуты и перезаписаны новыми файлами, а так же опустошать файловый кэш на тот размер, который запросят приложения. Для досконального разбора ситуации приведем вывод top с моего сервера:

Как ограничить файловый кэш в CentOS(Linux)?

Нас будут интересовать последний две строки. Строка Mem: показывает использование оперативной памяти. Первое значение с подписью total обозначает что используется система с 2 ГБ ОЗУ. Далее идет значение в 500+ МБ с припиской used, которая указывает сколько памяти занято на данный момент. После этого идет значение с припиской free, что говорит о свободной памяти. Далее приписка buffers — что то связано с буферами хз чего(пока не несет серьезной нагрузки в этой статье). И самое интересное, это последний пункт из последней строчки с припиской cached — показывает сколько памяти было использовано под файловый кэш, про который и шла речь чуть выше.

Исходя из приведенного скрина выходит, что оперативная память забита на 530МБ и что доступными для дальнейшего использования только 1.4 ГБ памяти.(Приведенный скрин не совсем хорошо описывает всю прелесть файлового кэша, когда после нескольких часов работы компьютера оперативка забивается на 90-95 процентов. Тут же приведен скрин работы после нескольких минут после включения компьютера).

Однако не деле же свободной являются 1,65 ГБ памяти, что выходит если сложить свободную память(free) и закэшированную память(cached) вместе. Это справедливо благодаря тому, что файловый кэш CentOS выделит занятые просторы оперативной памяти, если это понадобиться какому-то приложению или самой системе. Таким образом, под приложения и ОС(на данный момент) может быть выделено еще 250МБ, которая сейчас используется под файловый кэш.

Поэтому когда вы видите пугающе маленькие значения в поле free не забывайте прибавить к этому и значение поля cached. Тогда вы и получите полный объем свободной оперативной памяти. Исходя из всего этого можно вообще отказаться от каких-либо изменений в работе Linux(CentOS), так как действия ОС не слишком агрессивны и столь необходимая оперативная память для ваших приложений всегда будет доступна.

Проблемы при слишком большом файловом кэше

Однако на своем опыте скажу, что когда под файловый кэш вкупе с приложениями выделяется более 90-95% всей оперативной памяти, то дальнейшая работа всей системы несколько замедляет. Так как настройкой я занимался именно веб-сервера, то самым лучшим показателем тут становится быстродействие сайтов, которое начинает хромать при практически полностью заполненной ОЗУ. К тому же замечено, что при заполненной ОЗУ увеличивается работа центрального процессора, который постоянно решает что выкинуть из ОЗУ и что туда добавить. Поэтому было принято решение ограничить максимальный размер файлового кэша CentOS.

Очищение файлового кэша CentOS

В этом направление многие предлагают вручную очищать файловый кэш, а чтобы автоматизировать этот процесс, записать задание в cron с запуском раз в день, или раз в несколько часов. Для более полной картины приведу эту команду:

sh -c 'echo 1 > /proc/sys/vm/drop_caches'

Команда действительно делает свое дело и файловый кэш полностью очищается. Но и тут же начинает вновь пополняться и вскоре снова забьет все свободное место на диске. Но есть и другое решение.

Ограничение размера файлового кэша

Для этого нам необходимо изменить значение в файле /proc/sys/vm/min_free_kbytes на то значение, которое вы хотите чтобы не выделялось под файловый кэш. Другими словами, указанный вами в КБ размер оперативной памяти всегда будет оставаться пустым, не занятым файловым кэшем. Честно сказать, не нашел более конкретный материал в котором было бы сказано как именно этот параметр работает:

  1. Оставляет под приложения и систему указанный объем исходя из всего объема ОЗУ? или
  2. Оставляет под приложения и систему указанный объем исходя из свободной ОЗУ?

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

Но вернемся к файлу, которому я задал значение 700000, то есть 700 МБ. Сразу после изменения вы уже заметите изменения, так как файловый кэш будет сброшен настолько, чтобы удовлетворить новые требования. Однако такое состояние будет длиться только до ближайшей перезагрузки и потому нам нужно закрепить свои действия. Для этого в файл /etc/sysctl.conf дописать строчку

vm.min_free_kbytes=700000

Разумеется тут нужно указать ваше значение. Можете перезагрузить и проверить файл /proc/sys/vm/min_free_kbytes значение которого не должно смениться на значение по умолчанию.

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

Добавить комментарий

Ваш комментарий появится после модерации.