Huge pages
- title
- Huge pages
- type
- concept
- summary
- Страницы памяти Linux по 2 МБ / 1 ГБ вместо 4 КБ по умолчанию: меньше page fault'ов и нагрузки на TLB ценой предварительного резервирования
- tags
- linux, kernel, memory, performance
- sources
- linux-broke-postgresql
- created
- 2026-04-30
- updated
- 2026-07-22
- lang
- ru
- translation_of
- huge-pages
- source_updated
- 2026-07-22
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Linux сопоставляет виртуальную память с физической блоками фиксированного размера - страницами (pages). Размер по умолчанию - 4 КБ. На x86_64 и ARM64 ядро также поддерживает huge pages размером 2 МБ и 1 ГБ. Перевод крупного выделения памяти со страниц по умолчанию на huge pages даёт сразу два преимущества: количество page fault'ов при первом обращении (first-touch) сокращается на порядки, а нагрузка на Translation Lookaside Buffer (TLB) резко падает.
Две статьи накладных расходов, которые снижаются
Page fault'ы. Linux использует ленивое выделение: область, созданная через mmap, лишь регистрирует факт выделения, а физические страницы привязываются только при первом обращении через minor page fault. Область размером 120 ГБ при страницах по 4 КБ даёт до 31 миллиона потенциальных first-touch сбоев; со страницами 2 МБ - около 61 440; со страницами 1 ГБ - около 120. Обработка сбоев страниц не бесплатна: каждый из них отнимает микросекунды в ядре, а сбои в неудачный момент (например, при удержании spinlock'а) могут вызывать каскадный эффект. Канонический пример описан в linux-7-postgres-regression.
Нагрузка на TLB. Процессор кэширует недавние трансляции виртуальных адресов в физические в TLB. Промах вынуждает выполнять многоуровневый обход таблиц страниц (page-table walk). При страницах большего размера для покрытия того же рабочего набора требуется меньше записей, так что рабочий набор действительно помещается в TLB, и на горячем пути обходов удаётся избежать.
Оба эффекта - это проявление архитектуры памяти в производительности приложений. В memory-systems-cache-dram-disk подробно разобран уровень ниже: как устроены кэши SRAM, сколько на самом деле стоит активация строки в DRAM и почему обход таблиц страниц вообще настолько дорог.
Чем приходится жертвовать
Huge pages предварительно выделяются и резервируются на уровне ОС. Эта память недоступна другим процессам независимо от того, используете вы её или нет.
Усиливается внутренняя фрагментация. Huge page выделяется целиком, поэтому область, использующая лишь её часть, расходует остаток впустую.
Для долгоживущих процессов с высоким потреблением памяти - баз данных, JVM с большими кучами, кэшей в оперативной памяти - этот компромисс обычно выгоден. Для всего остального это фоновый шум.
Особенности PostgreSQL
PostgreSQL предоставляет параметр huge_pages с тремя значениями: off, on, try (по умолчанию). Значение try молча откатывается к 4 КБ, если huge pages недоступны, то есть можно ошибочно полагать, что huge pages работают. При значении on сервер не запустится, если huge pages не настроены на уровне ОС - это шумнее, но даёт точное понимание, в каком режиме работает система.