Кэш файловой системы Linux (Page Cache) используется для ускорения операций ввода-вывода. При определенных обстоятельствах администратор или разработчик может захотеть вручную очистить кеш. В этой статье мы объясним, как работает кеш файловой системы Linux. Затем мы продемонстрируем, как отслеживать использование кеша и как очищать кеш. Мы проведем несколько простых экспериментов с производительностью, чтобы убедиться, что кеш работает должным образом, и что процедура очистки кеша также работает должным образом.
Ядро резервирует определенный объем системной памяти для кэширования обращений к диску файловой системы, чтобы повысить общую производительность. Кеш в Linux называется кешем страниц. Размер кэша страницы можно настроить, при этом по умолчанию можно кэшировать большие объемы дисковых блоков. Максимальный размер кеша и правила удаления данных из кеша регулируются параметрами ядра. Подход кеширования linux называется кешем обратной записи. Это означает, что если данные записываются на диск, они записываются в память в кэш и помечаются как грязные в кэше, пока не будут синхронизированы с диском. Ядро поддерживает внутренние структуры данных, чтобы оптимизировать, какие данные удалять из кеша, когда в кеше требуется больше места.
Во время системных вызовов чтения Linux ядро проверяет, хранятся ли запрошенные данные в блоках данных в кэше, что будет успешным попаданием в кеш, и данные будут возвращены из кеша без выполнения каких-либо операций ввода-вывода в дисковую систему. В случае промаха кеша данные будут извлечены из системы ввода-вывода, и кэш будет обновлен на основе политик кэширования, поскольку эти же данные, вероятно, будут запрошены снова.
При достижении определенных пороговых значений использования памяти фоновые задачи начнут записывать грязные данные на диск, чтобы убедиться, что он очищает кеш памяти. Они могут повлиять на производительность приложений, интенсивно использующих память и ЦП, и требуют настройки администраторами и/или разработчиками.
Мы можем использовать команду free из командной строки, чтобы проанализировать системную память и объем памяти, выделенной для кеширования. См. Команду ниже:
# free -m
Из приведенной выше команды free мы видим, что в этой системе 7,5 ГБ ОЗУ. Из них используется только 209 МБ, а 6,5 МБ свободно. 667 МБ используется в буферном кэше. Теперь давайте попробуем увеличить это число, выполнив команду для создания файла размером 1 гигабайт и прочитав файл. Приведенная ниже команда сгенерирует примерно 100 МБ случайных данных, а затем добавит 10 копий файла в один large_file .
# dd if=/dev/random of=/root/data_file count=1400000 # for i in `seq 1 10`; do echo $i; cat data_file >> large_file; done
Теперь мы обязательно прочитаем этот 1-гигабайтный файл, а затем снова проверим бесплатную команду:
Мы видим, что использование буферного кеша увеличилось с 667 до 1735 мегабайт, что примерно на 1 гигабайт увеличилось в использовании буферного кеша.
Ядро linux предоставляет интерфейс для удаления кеша, давайте попробуем эти команды и посмотрим, как это повлияет на настройку free.
# echo 1 > /proc/sys/vm/drop_caches # free -m
Выше мы видим, что большая часть распределения буферного кеша была освобождена с помощью этой команды.
Можем ли мы провести проверку производительности использования кеша для чтения файла? Давайте прочитаем файл и запишем его обратно в /dev/null, чтобы проверить, сколько времени требуется для чтения файла с диска. Мы синхронизируем его с командой time. Мы выполняем эту команду сразу после очистки кеша с помощью приведенных выше команд.
На чтение файла ушло 8,4 секунды. Давайте прочитаем это снова, теперь, когда файл должен находиться в кеше файловой системы, и посмотрим, сколько времени это займет сейчас.
Бум! Чтобы прочитать его, потребовалось всего 0,2 секунды по сравнению с 8,4 секундами, когда файл не был кэширован. Чтобы проверить, давайте повторим это еще раз, сначала очистив кеш, а затем прочитав файл 2 раза.
Он работал отлично, как и ожидалось. 8,5 секунды для некэшированного чтения и 0,2 секунды для кэшированного чтения.
Кэш страниц автоматически включается в системах Linux и ускоряет ввод-вывод, сохраняя в кеше недавно использованные данные. Если вы хотите вручную очистить кеш, это можно легко сделать, отправив команду echo в файловую систему /proc с указанием ядру удалить кеш и освободить память, используемую для кеша. Инструкции по запуску команды были показаны выше в этой статье, а также показаны экспериментальные проверки поведения кеша до и после очистки.