Настройка использования huge pages в Linux
Включение использования huge pages
Применение huge pages — больших страниц памяти — снижает накладные расходы, когда ADPG/PostgreSQL использует большие смежные фрагменты памяти. В частности, это происходит, если параметр shared_buffers имеет большое значение.
В ADPG значение по умолчанию параметра конфигурации huge_pages
— try
, но обычно поддержка huge pages выключена в операционной системе. Чтобы эффективно использовать huge pages, необходимо включить их поддержку на стороне операционной системы. Для этого выполните следующие шаги:
-
Убедитесь, что ядро 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
-
Проверьте, что в настоящее время 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
-
Убедитесь, что параметр ADPG
huge_pages
имеет значениеtry
, например, это можно сделать с помощьюpsql
:SHOW huge_pages;
Результат:
huge_pages ------------ try
-
Определите количество 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, протестируйте разные размеры страниц со своей базой данных. -
Установите параметр ядра 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 ...
-
Запустите кластер:
$ 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 на запущенном кластере. Полученные результаты также необходимо протестировать.
-
Определите pid процесса postmaster:
$ sudo head -1 /pg_data1/adpg16/postmaster.pid
Вывод:
895
-
Получите значение пикового использования памяти процессом postmaster с помощью pid:
$ grep ^VmPeak /proc/895/status
Вывод:
VmPeak: 403440 kB
-
Рассчитайте количество 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. Также содержит это имя вывод команды Patronilist
:/usr/lib/adpg16/usr/bin/patronictl -c /etc/adpg16-patroni/adpg16-patroni.yml list
.
ПРИМЕЧАНИЕ
Huge pages настраиваются индивидуально для каждого хоста. Повторите настройку huge pages на всех хостах, где это необходимо.
|