linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/page-cache

kb/processes ── Процессы и ресурсы ── advanced

Page cache - диск в памяти

Page cache - кеш в RAM для содержимого файлов. Любое чтение/запись ФС идёт через него. «Used» в free выглядит большим, но page cache - это availabe.

view as markdownaka: buffers, disk-cache, file-cache

Зачем

Disk slow, RAM fast. Page cache держит блоки файлов в памяти, чтобы:

  1. Повторное чтение того же файла не лезло на диск
  2. Запись возвращалась мгновенно (writeback позже)
  3. mmap-файлы работали без явного read()

Это прозрачно: программы пишут в обычные файлы, ядро само кеширует. Управление - большая часть linux-vm подсистемы.

free -h: что значат колонки

              total   used   free   shared  buff/cache  available
Mem:           16Gi  4.0Gi  500Mi   100Mi        12Gi      11Gi
Swap:          4Gi    0     4Gi
  • used - реально занято процессами + ядром
  • free - никем не используется (обычно мало!)
  • buff/cache - page cache; доступно процессам по требованию
  • available - оценка сколько новый процесс реально получит (примерно used + reclaimable cache)

«Linux ate my RAM» - миф. Если available большой - всё ок, кеш отдадут под allocation мгновенно. Главное смотреть на available, не на free.

Buffers vs Cache

Исторически:

  • Buffers - кеш block-level (raw блоки устройства)
  • Cache - кеш ФС-уровня (файлы)

На современных kernel'ах разница почти стёрлась, оба попадают в page cache. В free они сложены в buff/cache.

Dirty pages и writeback

Когда программа пишет в файл, страница помечается dirty (грязная). Ядро сбрасывает её на диск асинхронно - через writeback.

bash
cat /proc/meminfo | grep -E 'Dirty|Writeback'
# Dirty:        12 MB    ← модифицированы, ещё не на диске
# Writeback:    0 MB     ← в процессе записи прямо сейчас

Контролируется sysctl'ями:

bash
cat /proc/sys/vm/dirty_ratio              # % RAM с которого ЗАСТАВЛЯЕТ записать (default 20)
cat /proc/sys/vm/dirty_background_ratio   # % с которого начинает в фоне (default 10)
cat /proc/sys/vm/dirty_expire_centisecs   # как долго dirty может ждать (default 30s)

Слишком большой dirty_ratio = долгие fsync-stall'ы при сбросе. Слишком маленький = больше I/O. На прод-БД часто тюнят.

sync, fsync, sync()

bash
sync                            # сбросить ВСЕ dirty pages всех ФС (можно перед reboot)

В программах:

  • fsync(fd) - гарантирует что данные файла на диске
  • fdatasync(fd) - то же, но без метаданных (быстрее)
  • O_SYNC флаг при open() - каждая запись синхронная (медленно)

БД и журнальные системы используют fsync на каждый commit - отсюда важность fast NVMe vs HDD для transaction throughput.

drop_caches - освободить кеш руками

bash
sync                                       # сначала сбросить dirty
echo 3 | sudo tee /proc/sys/vm/drop_caches # 1=pagecache 2=dentries+inodes 3=всё

Зачем: бенчмаркить cold-cache производительность, провоцировать reload, debugging. На проде НЕ делать - потом первое чтение большого файла станет тормозным.

Direct I/O - обход кеша

Когда программа сама управляет кешированием (БД, видеоплееры):

c
open(path, O_DIRECT | O_RDWR, ...);

Чтение/запись летят прямо на диск, минуя page cache. Минус - все размеры и offset'ы должны быть выровнены по сектору.

Readahead

Ядро видит последовательное чтение файла и превентивно загружает следующие блоки - readahead:

bash
blockdev --getra /dev/sda                  # размер readahead в 512-байтных секторах
blockdev --setra 16384 /dev/sda             # увеличить (для streaming workload)

Большой readahead помогает sequential, мешает random (читает то что не пригодится).

fadvise / madvise

Программа может подсказать ядру:

  • posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED) - «забудь этот файл из кеша» (после копирования больших файлов хорошо звать, чтобы не вытесняли горячие данные)
  • POSIX_FADV_SEQUENTIAL - увеличить readahead
  • POSIX_FADV_RANDOM - отключить readahead

Утилита vmtouch - портит/прогревает кеш руками для бенчмарков.

Page cache в cgroups v2

В контейнере page cache считается per-cgroup. Лимит memory.max включает и кеш. Поэтому контейнер с маленьким лимитом памяти, читающий большой файл, может OOM'нуться даже без heap-allocations.

§ команды

bash
free -h

Память + page cache; смотрим на 'available', не на 'free'

bash
cat /proc/meminfo | grep -E 'Cached|Buffers|Dirty'

Подробный break down: сколько в кеше, сколько ждёт writeback

bash
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Очистить кеш для бенчмарка cold-cache (НЕ на проде)

bash
sudo sysctl -w vm.dirty_background_ratio=5

Снизить порог фонового writeback - для БД-тюнинга

bash
vmtouch /var/lib/postgres/base

Прогреть в кеш конкретный путь (если установлен vmtouch)

§ см. также

  • virtual-memoryVirtual memory - виртуальные адреса, page tablesКаждый процесс видит свой 64-битный virtual address space. MMU переводит виртуальные адреса в физические через page tables. Это основа изоляции и mmap.
  • mount-and-fstabmount и /etc/fstab - подключение ФС`mount` подключает блочное устройство или ФС к точке монтирования в дереве. `/etc/fstab` - список того что монтировать при загрузке.
  • mmapmmap - файлы и shared memory`mmap()` маппит файл (или анонимный регион) в virtual address space процесса. Любые read/write через указатель = операции с файлом. Основа shared memory.
  • io-uringio_uring - third-rank async I/O syscallio_uring - shared-memory очередь между userspace и kernel. SQE submit без syscall (с SQPOLL). CQE - completion. Поддержка read/write/accept/connect/recv/send. Заменяет aio+epoll для I/O-bound сервисов. CVE 2022-2024 - не enable бездумно.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки