Huge Pages в PostgreSQL: различия между версиями

Материал из support.qbpro.ru
(Новая страница: «==ВВЕДЕНИЕ== В PostgreSQL начиная с версии 9.4 появилась поддержка больших страниц. Это очень хорошая новость, с большими страницами я познакомился когда работал с виртуализацией. Коротко о чем же речь. В ОС Linux работа с памятью основывается на обращении к стра...»)
 
Нет описания правки
Строка 1: Строка 1:
==ВВЕДЕНИЕ==
==ВВЕДЕНИЕ==
В PostgreSQL начиная с версии 9.4 появилась поддержка больших страниц. Это очень хорошая новость, с большими страницами я познакомился когда работал с виртуализацией. Коротко о чем же речь. В ОС Linux работа с памятью основывается на обращении к страницам размер которых равен 4kB (на самом деле зависит от платформы, проверить можно через getconf PAGE_SIZE), так вот когда объем памяти переваливает за несколько десятков, а то и сотни гигабайт управлять ею становится сложнее, увеличиваются накладные расходы на адресацию памяти и поддержание страничных таблиц. Для облегчения жизни и были придуманы большие страницы, размер которых может быть 2MB а то и 1GB. За счет использования больших страниц можно получить ощутимый прирост скорости работы и увеличение отзывчивости в приложениях которые активно работают с памятью. Как я уже отметил, впервые я столкнулся с большими страницами при работе с виртуализацией, в частности с KVM. Проведенные в свое время тесты показали что прирост производительности виртуальных машин составил от 7 до 10% (измерялось все это дело синтетическими тестами различных сервисов типа redis/memcache/postgres/etc внутри виртуальных машин). Теперь это появилось в PostgreSQL.<br>
В '''PostgreSQL''' начиная с версии '''9.4''' появилась поддержка больших страниц. Это очень хорошая новость, с большими страницами я познакомился когда работал с виртуализацией. Коротко о чем же речь. В '''ОС Linux''' работа с памятью основывается на обращении к страницам размер которых равен 4kB (на самом деле зависит от платформы, проверить можно через '''getconf PAGE_SIZE'''), так вот когда объем памяти переваливает за несколько десятков, а то и сотни гигабайт управлять ею становится сложнее, увеличиваются накладные расходы на адресацию памяти и поддержание страничных таблиц. Для облегчения жизни и были придуманы большие страницы, размер которых может быть 2MB а то и 1GB. За счет использования больших страниц можно получить ощутимый прирост скорости работы и увеличение отзывчивости в приложениях которые активно работают с памятью. Как я уже отметил, впервые я столкнулся с большими страницами при работе с виртуализацией, в частности с '''KVM'''. Проведенные в свое время тесты показали что прирост производительности виртуальных машин составил от 7 до 10%<br>
* Итак вернемся к теме статьи, к поддержке больших страниц в PostgreSQL. Если честно, я давно этого ждал. Вобще запустить PostgreSQL с поддержкой больших страниц можно было и раньше, с помощью libhugetlbfs. Однако теперь есть встроенная поддержка. Ниже описание процесса как настроить и запустить PostgreSQL с поддержкой больших страниц.
* (измерялось все это дело синтетическими тестами различных сервисов типа redis/memcache/postgres/etc внутри виртуальных машин). Теперь это появилось в '''PostgreSQL'''.<br>
* Итак вернемся к теме статьи, к поддержке больших страниц в '''PostgreSQL'''. Если честно, я давно этого ждал. Вобще запустить '''PostgreSQL''' с поддержкой больших страниц можно было и раньше, с помощью libhugetlbfs. Однако теперь есть встроенная поддержка.<br> Ниже описание процесса как настроить и запустить PostgreSQL с поддержкой больших страниц.
 
==НАСТРОЙКА РАБОТЫ Huge Pages==
* Для начала следует убедиться что ядро поддерживает большие страницы. Проверяем конфиг ядра на предмет наличия опций
CONFIG_HUGETLBFS и CONFIG_HUGETLB_PAGE.
# grep HUGETLB /boot/config-$(uname -r)
CONFIG_CGROUP_HUGETLB=y
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set
* Linux Debian - Kernel 6.1.0-0.deb11.41-amd64
 
В случае отсутствия этих опций, ничего не заработает и ядро следует пересобрать (актуально для '''Gentoo''' например).
Очевидно что нам понадобится '''PostgreSQL''' версии '''9.4''' и выше. Установку пакетов и инициализацию кластера оставляю за кадром, т.к. в зависимости от дистрибутива способ будет отличаться. Переходим сразу к файлу конфигурации postgresql.conf.<br>
За поддержку больших страниц отвечает параметр '''huge_page''' который может принимать три значения,
'''off''' — не использовать большие страницы,
'''on''' — использовать большие страницы,
'''try''' — попытаться использовать большие страницы<br>
и в случае недоступности откатиться на использование обычных страниц. Значение '''try''' используется по-умолчанию и является безопасным вариантом. В случае '''on''', сервис не запустится если большие страницы не определены в системе (или их недостаточно).<br>
* В случае запуска можно получить такую ошибку:
FATAL: could not map anonymous shared memory: Cannot allocate memory
HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space or
huge pages. To reduce the request size (currently 148324352 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

Версия от 19:31, 25 декабря 2025

ВВЕДЕНИЕ

В PostgreSQL начиная с версии 9.4 появилась поддержка больших страниц. Это очень хорошая новость, с большими страницами я познакомился когда работал с виртуализацией. Коротко о чем же речь. В ОС Linux работа с памятью основывается на обращении к страницам размер которых равен 4kB (на самом деле зависит от платформы, проверить можно через getconf PAGE_SIZE), так вот когда объем памяти переваливает за несколько десятков, а то и сотни гигабайт управлять ею становится сложнее, увеличиваются накладные расходы на адресацию памяти и поддержание страничных таблиц. Для облегчения жизни и были придуманы большие страницы, размер которых может быть 2MB а то и 1GB. За счет использования больших страниц можно получить ощутимый прирост скорости работы и увеличение отзывчивости в приложениях которые активно работают с памятью. Как я уже отметил, впервые я столкнулся с большими страницами при работе с виртуализацией, в частности с KVM. Проведенные в свое время тесты показали что прирост производительности виртуальных машин составил от 7 до 10%

  • (измерялось все это дело синтетическими тестами различных сервисов типа redis/memcache/postgres/etc внутри виртуальных машин). Теперь это появилось в PostgreSQL.
  • Итак вернемся к теме статьи, к поддержке больших страниц в PostgreSQL. Если честно, я давно этого ждал. Вобще запустить PostgreSQL с поддержкой больших страниц можно было и раньше, с помощью libhugetlbfs. Однако теперь есть встроенная поддержка.
    Ниже описание процесса как настроить и запустить PostgreSQL с поддержкой больших страниц.

НАСТРОЙКА РАБОТЫ Huge Pages

  • Для начала следует убедиться что ядро поддерживает большие страницы. Проверяем конфиг ядра на предмет наличия опций

CONFIG_HUGETLBFS и CONFIG_HUGETLB_PAGE.

# grep HUGETLB /boot/config-$(uname -r)
CONFIG_CGROUP_HUGETLB=y
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set
  • Linux Debian - Kernel 6.1.0-0.deb11.41-amd64

В случае отсутствия этих опций, ничего не заработает и ядро следует пересобрать (актуально для Gentoo например). Очевидно что нам понадобится PostgreSQL версии 9.4 и выше. Установку пакетов и инициализацию кластера оставляю за кадром, т.к. в зависимости от дистрибутива способ будет отличаться. Переходим сразу к файлу конфигурации postgresql.conf.
За поддержку больших страниц отвечает параметр huge_page который может принимать три значения,

off — не использовать большие страницы,
on — использовать большие страницы,
try — попытаться использовать большие страницы

и в случае недоступности откатиться на использование обычных страниц. Значение try используется по-умолчанию и является безопасным вариантом. В случае on, сервис не запустится если большие страницы не определены в системе (или их недостаточно).

  • В случае запуска можно получить такую ошибку:
FATAL: could not map anonymous shared memory: Cannot allocate memory
HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space or 
huge pages. To reduce the request size (currently 148324352 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.