HUGEPAGES_CONFIG_ERROR
Linux / DevOps
Настройка HugePages и отключение Transparent HugePages (THP) для СУБД
- Непредсказуемые задержки (latency spikes) и блокировки в Redis, MongoDB или PostgreSQL.
- Высокое потребление CPU потоком ядра
[khugepaged]в режиме compaction/defrag. - Раздувание таблиц страниц памяти (
PageTablesв/proc/meminfoзанимает десятки гигабайт).
1. Отключение Transparent HugePages (Рекомендовано для Redis, Mongo, Postgres)
Создайте systemd-юнит /etc/systemd/system/disable-thp.service:
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'
[Install]
WantedBy=basic.targetsystemctl daemon-reload && systemctl enable --now disable-thp.service2. Настройка статических HugePages (для PostgreSQL / Oracle / QEMU)
Рассчитайте необходимое число страниц по 2MB (например, для 16GB RAM: 16 * 1024 / 2 = 8192 страниц):
В файле /etc/sysctl.d/99-hugepages.conf:
# Выделение 8192 страниц по 2MB (~16GB)
vm.nr_hugepages = 8192
# Разрешить группе dba/postgres (GID 1001) доступ к HugePages
vm.hugetlb_shm_group = 1001sysctl --system3. Проверка статуса HugePages
cat /proc/meminfo | grep -i huge
Практический опыт инженера:
При настройке vm.nr_hugepages задавайте параметр на этапе загрузки ОС через sysctl или boot-параметры grub (hugepages=8192), иначе из-за фрагментации памяти ядро не сможет выделить непрерывный пул страниц на работающем сервере.
Частые вопросы (FAQ)
Почему базы данных не рекомендуют Transparent HugePages (THP)?
THP выделяет страницы по 2MB динамически. Фоновый процесс ядра khugepaged для объединения мелких страниц выполняет операцию defragmentation, что блокирует доступ к страницам памяти приложения и вызывает резкие фризы (latency spikes).
Как активировать HugePages в PostgreSQL?
В postgresql.conf установите параметр huge_pages = on (или try) и убедитесь, что размер shared_buffers помещается в выделенный объем HugePages.