Открыть сервис

Page cache

Page cache — это механизм кэширования данных, используемый операционными системами для ускорения доступа к файлам и блочным устройствам. Он представляет собой область оперативной памяти, в которой хранятся копии данных, недавно прочитанных с диска или записанных на него. При повторном обращении к тем же данным система считывает их из быстрой оперативной памяти, минуя медленный диск, что значительно повышает производительность ввода-вывода.

Принцип работы

Page cache работает на уровне страниц памяти — минимальных единиц управления памятью, размер которых обычно составляет 4 КБ (на архитектуре x86). Когда процесс выполняет системный вызов read(), ядро операционной системы сначала проверяет, есть ли запрашиваемые страницы в кэше. Если данные присутствуют (так называемое «попадание в кэш», cache hit), они копируются в буфер пользовательского пространства без обращения к диску. Если данных нет («промах», cache miss), ядро инициирует чтение с диска, после чего сохраняет прочитанные страницы в кэше для последующего использования.

Аналогично работает запись: при вызове write() данные сначала помещаются в page cache, а затем асинхронно сбрасываются на диск в фоновом режиме. Такой подход называется отложенной записью (write-back). Он позволяет группировать мелкие записи в крупные блоки и снижает количество операций ввода-вывода.

Управление и вытеснение

Поскольку объём оперативной памяти ограничен, ядро вынуждено управлять заполнением кэша. Когда свободная память заканчивается, система вытесняет (evicts) наименее используемые страницы. Алгоритм вытеснения в Linux основан на двух связанных списках — активном и неактивном. Страницы, к которым обращаются часто, перемещаются в активный список, а редко используемые — в неактивный, откуда они в первую очередь удаляются при нехватке памяти.

Существуют и другие механизмы управления:

  • Чистые страницы (clean) — данные, которые совпадают с содержимым диска; их можно удалить без записи.
  • Грязные страницы (dirty) — содержат изменения, ещё не записанные на диск; перед удалением их необходимо сбросить.
  • Параметры ядра — например, vm.dirty_ratio и vm.dirty_background_ratio в Linux регулируют, какой процент памяти может занимать грязные страницы до начала принудительной записи.

Реализации в операционных системах

В Linux page cache является частью подсистемы виртуальной памяти и тесно связан с файловой системой. Он поддерживает механизм отображения файлов в память (memory-mapped files), позволяя процессам обращаться к файлам как к обычным массивам байтов в адресном пространстве. В Windows аналогичную функцию выполняет системный кэш (system cache), управляемый диспетчером памяти. В macOS и BSD-системах используется унифицированный кэш (unified buffer cache), который также кэширует метаданные файловой системы.

Важной особенностью page cache является его универсальность: он кэширует не только обычные файлы, но и данные блочных устройств, сетевых файловых систем (NFS, CIFS) и даже содержимое исполняемых файлов. Это позволяет ускорить запуск программ и работу с базами данных.

Влияние на производительность

Эффективность page cache напрямую влияет на скорость работы приложений. Для серверов баз данных, где типична ситуация «рабочий набор» (working set) больше доступной памяти, правильно настроенный кэш может обеспечить десятки тысяч операций чтения в секунду. Однако избыточное использование кэша может привести к нехватке памяти для приложений, поэтому современные ядра применяют динамическое балансирование.

Существуют инструменты для наблюдения за состоянием кэша: в Linux это утилиты free, vmstat, sar, а также псевдофайлы в /proc/meminfo. Для принудительной очистки кэша используется echo 3 > /proc/sys/vm/drop_caches (требует прав root).

Применение и особенности

Page cache широко используется в:

  • файловых серверах и NAS-хранилищах;
  • системах управления базами данных (например, PostgreSQL и MySQL полагаются на кэш операционной системы в дополнение к собственным буферам);
  • контейнерных средах, где несколько контейнеров могут совместно использовать одни и те же кэшированные страницы образов;
  • системах реального времени, где предсказуемость задержек важнее пиковой производительности (в таких случаях кэш может быть отключён или ограничен).

Особенностью page cache является то, что он прозрачен для приложений: процессы не управляют им напрямую, а лишь наблюдают его эффект. При этом существуют системные вызовы (например, posix_fadvise() с флагом POSIX_FADV_DONTNEED), позволяющие приложению подсказать ядру, что определённые данные больше не понадобятся.

Литература

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →