Введение / Зачем это нужно
Huge pages (большие страницы памяти) — это механизм Linux, позволяющий использовать страницы памяти размером 2 МБ или 1 ГБ вместо стандартных 4 КБ. Это снижает нагрузку на TLB (Translation Lookaside Buffer) и уменьшает количество page faults, что особенно полезно для приложений с высоким потреблением памяти, таких как базы данных (Oracle, MySQL), системы виртуализации (KVM) и высокопроизводительные вычисления. В этом гайде вы узнаете, как настроить как стандартные huge pages, так и transparent huge pages (THP) в Linux для оптимизации производительности.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к системе Linux с правами суперпользователя (root или через sudo).
- Вы знакомы с базовыми командами терминала и редактированием файлов.
- Установлены утилиты:
grep,sysctl,grub2-mkconfig(для GRUB2) илиupdate-grub(для Ubuntu/Debian). - Ваше приложение поддерживает huge pages (например, Oracle Database требует явной настройки
use_large_pages=TRUE). - Система имеет достаточно свободной памяти для резервирования huge pages (каждая 2 МБ страница резервируется при загрузке).
Шаг 1: Проверка текущей конфигурации huge pages
Сначала определите, какие huge pages уже настроены. Выполните:
grep -i huge /proc/meminfo
Обратите внимание на поля:
HugePages_Total: общее количество резервированных huge pages.HugePages_Free: количество свободных huge pages.Hugepagesize: размер одной huge page (обычно 2048 kB для 2 МБ).
Для transparent huge pages (THP) проверьте:
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
Вывод будет выглядеть как:
[always] madvise never
где текущий режим выделен в квадратных скобках. always — THP всегда используются, madvise — только по запросу приложения, never — отключены.
Шаг 2: Определение требуемого количества huge pages
Рассчитайте, сколько huge pages нужно для вашего приложения. Например, если приложению требуется 16 ГБ памяти, и размер huge page 2 МБ:
Количество = (16 * 1024 МБ) / 2 МБ = 8192 страниц.
Учтите, что huge pages резервируются в физической памяти и недоступны для других процессов. Выделяйте с запасом, но не слишком много, чтобы не истощить память. Для приложений, которые используют не всё одновременно, можно выделить меньше.
Шаг 3: Настройка стандартных huge pages через sysctl
Для временной настройки (действует до перезагрузки) используйте sysctl:
sudo sysctl vm.nr_hugepages=8192
Чтобы сделать настройку постоянной, отредактируйте /etc/sysctl.conf:
vm.nr_hugepages=8192
Примените изменения:
sudo sysctl -p
Однако, sysctl применяет настройку после загрузки системы, и huge pages будут выделены только если в памяти достаточно непрерывных свободных блоков. Для гарантированного резервирования при загрузке лучше использовать параметр ядра в GRUB.
Шаг 4: Настройка через GRUB (рекомендуется)
Редактируйте конфигурацию GRUB:
sudo nano /etc/default/grub
Найдите строку, начинающуюся с GRUB_CMDLINE_LINUX, и добавьте hugepages=8192. Например:
GRUB_CMDLINE_LINUX="quiet splash hugepages=8192"
Если нужно использовать huge pages размером 1 ГБ (требуется поддержка ядра и конфигурация), добавьте также hugepagesz=1G:
GRUB_CMDLINE_LINUX="quiet splash hugepages=8192 hugepagesz=1G"
После изменения обновите конфигурацию GRUB:
Для Ubuntu/Debian:
sudo update-grub
Для RHEL/CentOS:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Затем перезагрузите систему, чтобы huge pages были зарезервированы при загрузке.
⚠️ Важно: Убедитесь, что выделенное количество huge pages не превышает доступной физической памяти. Рекомендуется выделять не более 50% от общей памяти, чтобы оставить место для ОС и других процессов.
Шаг 5: Настройка transparent huge pages (THP)
Transparent huge pages управляются ядром автоматически, но вы можете изменить поведение. Для отключения THP или установки в режим madvise (рекомендуется для многих приложений) выполните:
Временно (до перезагрузки):
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
Для постоянной настройки создайте systemd-сервис. Создайте файл /etc/systemd/system/disable-thp.service:
[Unit]
Description=Disable Transparent Huge Pages
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo madvise > /sys/kernel/mm/transparent_hugepage/enabled"
[Install]
WantedBy=multi-user.target
Включите и запустите сервис:
sudo systemctl daemon-reload
sudo systemctl enable disable-thp.service
sudo systemctl start disable-thp.service
Альтернативно, можно добавить в /etc/rc.local, но systemd предпочтительнее.
💡 Совет: Режим
madviseчасто является оптимальным для THP, так как он позволяет приложению явно запрашивать huge pages черезmadvise(MADV_HUGEPAGE), избегая случайных латенси от автоматического управления.
Шаг 6: Перезагрузка системы
После настройки через GRUB или для применения изменений в THP перезагрузите систему:
sudo reboot
После перезагрузки проверьте конфигурацию, как описано в Шаге 1.
Проверка результата
После перезагрузки убедитесь, что huge pages настроены правильно:
- Проверьте стандартные huge pages:
grep -i huge /proc/meminfoHugePages_Totalдолжно соответствовать заданному значению, аHugePages_Free— быть близким к нему (если huge pages не используются приложениями). - Проверьте THP:
cat /sys/kernel/mm/transparent_hugepage/enabled
Должно отображать выбранный режим (например,madvise). - Для конкретных приложений:
- Oracle Database: запрос
SELECT * FROM V$SGASTAT WHERE NAME LIKE '%Huge%';должен показывать использование huge pages. - MySQL (InnoDB): в
SHOW ENGINE INNODB STATUSищите "Huge pages" или проверьте/proc/<pid>/smapsна наличие "huge" вхождения.
- Oracle Database: запрос
Если значения соответствуют ожидаемым, настройка успешна.
Возможные проблемы
- Система не загружается после добавления hugepages в GRUB: Это может произойти, если выделено слишком много huge pages и памяти не хватает при загрузке. Загрузитесь в recovery mode или с помощью Live CD, отредактируйте
/etc/default/grubи уменьшите значениеhugepages, затем обновите GRUB. - Huge pages не резервируются после перезагрузки: Убедитесь, что параметр
hugepagesуказан правильно в GRUB и что ядро поддерживает huge pages (проверьтеgrep CONFIG_HUGETLBFS /boot/config-$(uname -r)). Также проверьте, достаточно ли свободной памяти при загрузке. - Приложение не использует huge pages: Для Oracle убедитесь, что в
spfileустановленuse_large_pages=TRUEи SGA размером соответствует huge pages. Для других приложений проверьте документацию по настройке huge pages. - Transparent huge pages вызывают латенси или падения производительности: Некоторые приложения работают лучше с THP отключенным. Экспериментируйте с режимами
always,madvise,never. Режимmadviseчасто является компромиссом. - Ошибки при записи в /sys/kernel/mm/transparent_hugepage/enabled: Убедитесь, что вы выполняете команду от root и что файл существует (на очень старых ядрах THP может отсутствовать). В таком случае обновите ядро.
Если проблемы persist, проверьте логи ядра (dmesg | grep huge) на наличие ошибок.