Настройка использования huge pages в Linux

Включение использования huge pages

Применение huge pages — больших страниц памяти — снижает накладные расходы, когда ADPG/PostgreSQL использует большие смежные фрагменты памяти. В частности, это происходит, если параметр shared_buffers имеет большое значение.

В ADPG значение по умолчанию параметра конфигурации huge_pages — try, но обычно поддержка huge pages выключена в операционной системе. Чтобы эффективно использовать huge pages, необходимо включить их поддержку на стороне операционной системы. Для этого выполните следующие шаги:

  1. Убедитесь, что ядро Linux имеет настройки CONFIG_HUGETLBFS=y и CONFIG_HUGETLB_PAGE=y, необходимые для использования huge pages. Выполните следующую команду:

    $ grep HUGETLB /boot/config-$(uname -r)

    Пример результата выполнения команды:

    CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
    CONFIG_CGROUP_HUGETLB=y
    CONFIG_HUGETLBFS=y
    CONFIG_HUGETLB_PAGE=y
  2. Проверьте, что в настоящее время huge pages не используются. Можно получить информацию из подсистемы виртуальной памяти:

    $ cat /proc/sys/vm/nr_hugepages

    Вывод:

    0

    Кроме того, информацию о huge pages можно получить из /proc/meminfo — файла, который содержит статистику использования памяти:

    $ grep ^HugePages /proc/meminfo

    Вывод:

    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
  3. Убедитесь, что параметр ADPG huge_pages имеет значение try, например, это можно сделать с помощью psql:

    SHOW huge_pages;

    Результат:

     huge_pages
    ------------
     try
  4. Определите количество huge pages для резервирования.

    Остановите кластер:

    $ sudo systemctl stop adpg16-patroni.service

    Получите размер huge pages, установленный в системе:

    $ grep ^Hugepagesize /proc/meminfo
    Hugepagesize:       2048 kB

    Вычисляемый runtime-параметр PostgreSQL shared_memory_size_in_huge_pages определяет количество требуемых huge pages. Значение этого параметра можно получить с помощью команды postgres, где /pg_data1/adpg16 — путь к postgresql.conf, который может быть заменен на переменную окружения $PGDATA, если она установлена.

    $ postgres -D /pg_data1/adpg16 -C shared_memory_size_in_huge_pages

    Вывод:

    73

    В этом примере требуется не менее 73 huge pages. Большее значение можно использовать, если и другим программам тоже необходимы huge pages.

    Команда ниже отображает подкаталоги в формате hugepages-<размер>kB, где <размер> — размер huge pages, поддерживаемых комбинацией ядра и процессора.

    $ ls /sys/kernel/mm/hugepages

    Вывод:

    hugepages-1048576kB  hugepages-2048kB

    Размер страницы huge pages по умолчанию составляет 2 МБ, но также можно явно запросить либо 2 МБ, либо 1 ГБ с помощью конфигурационного параметра huge_page_size. Для установки этого параметра используйте раздел ADPG configurations на странице Primary configuration сервиса ADPG (см. Конфигурационные параметры). Количество страниц, рассчитанное с помощью shared_memory_size_in_huge_pages, будет адаптировано к размеру страницы. Чтобы определить оптимальный размер страницы huge pages, протестируйте разные размеры страниц со своей базой данных.

  5. Установите параметр ядра OC vm.nr_hugepages, который определяет количество huge pages для резервирования. Необходимо выполнить следующую команду от имени пользователя root:

    $ sudo su -
    
    $ echo 'vm.nr_hugepages = 73' >> /etc/sysctl.d/30-postgresql.conf

    Загрузите параметры ядра из всех файлов:

    $ sysctl -p --system

    Проверьте результат, используя следующие команды:

    $ grep ^HugePages /proc/meminfo

    Вывод:

    HugePages_Total:      73
    HugePages_Free:       73
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    $ sudo sysctl -a | grep 'huge*page'

    Вывод должен содержать указанное значение vm.nr_hugepages:

    ...
    vm.nr_hugepages = 73
    ...
  6. Запустите кластер:

    $ sudo systemctl start adpg16-patroni.service

    Посмотрите, как изменилась статистика:

    $ grep ^HugePages /proc/meminfo

    Вывод:

    HugePages_Total:      73
    HugePages_Free:       63
    HugePages_Rsvd:       63
    HugePages_Surp:        0

Расчет необходимого количества huge pages на работающем кластере

Оптимальный размер и количество huge pages определяется в результате тестирования, и если вам не подошел первый вариант расчета, приведенный выше, можно попробовать рассчитать количество huge pages на запущенном кластере. Полученные результаты также необходимо протестировать.

  1. Определите pid процесса postmaster:

    $ sudo head -1 /pg_data1/adpg16/postmaster.pid

    Вывод:

    895
  2. Получите значение пикового использования памяти процессом postmaster с помощью pid:

    $ grep ^VmPeak /proc/895/status

    Вывод:

    VmPeak:   403440 kB
  3. Рассчитайте количество huge pages как значение VmPeak, разделенное на размер страницы huge pages плюс 1 — 403440/2048+1. В этом примере необходимое количество huge pages — 197.

Поскольку этот метод не требует остановки кластера, вам необходимо перезапустить кластер вместо запуска после указания параметра vm.nr_hugepages (шаг 6, описанный выше). Нажмите y и Enter для подтверждения операции, когда это необходимо:

$ /usr/lib/adpg16/usr/bin/patronictl -c /etc/adpg16-patroni/adpg16-patroni.yml \
    restart a80bfefc-755f-4ccb-8614-989f0ddda0e7 test_adpg_cluster_eek1-adpg-adpg3

Где:

  • a80bfefc-755f-4ccb-8614-989f0ddda0e7 — UUID кластера. Его можно найти в пользовательском интерфейсе ADCM на вкладке кластера Configuration.

  • test_adpg_cluster_eek1-adpg-adpg3 — имя текущей ноды в Patroni. В пользовательском интерфейсе ADCM это имя можно найти на вкладке Info сервиса ADPG. Также содержит это имя вывод команды Patroni list: /usr/lib/adpg16/usr/bin/patronictl -c /etc/adpg16-patroni/adpg16-patroni.yml list.

ПРИМЕЧАНИЕ
Huge pages настраиваются индивидуально для каждого хоста. Повторите настройку huge pages на всех хостах, где это необходимо.
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней