Настройка PostgreSQL для работы с HugePages.
В статье описывается настройка PostgreSQL с использованием больших страниц HugePages. Установка выполнялась в Gentoo Linux, но учитывая что технология HugeTLB является дистронезависимой, описанный подход будет универсален для любых дистрибутивов, чьи ядра поддерживают HugePages.Проверяем поддержку больших страниц в ядре Linux
# zgrep HUGE /proc/config.gz
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
# cave resolve libhugetlbfs -x
Теперь нужно создать пулы страниц. Для этого смотрим сколько всего доступно памяти и в зависимости от объема определяем минимальную и максимальную границу пула. Максимальный объем пула делаем 3,5 GB.
# free
total used free shared buffers cached
Mem: 4051308 3136496 914812 0 141180 2716328
-/+ buffers/cache: 278988 3772320
Swap: 1048572 19444 1029128
# hugeadm --pool-pages-min 2M:128M
# hugeadm --pool-pages-max 2M:3500M
Затем в соответствии с созданными пулами необходимо установить рекомендуемое значение shmmax.
# hugeadm --set-recommended-shmmax
# hugeadm --set-recommended-min_free_kbytes
Теперь нужно дать разрешение группе postgres использовать пулы hugetlb. Сначала выясняем id группы, затем подставляем этот id в качестве аргумента для set-shm-group
# id postgres
uid=70(postgres) gid=70(postgres) groups=70(postgres)
# hugeadm --set-shm-group 70
Монтируем файловую систему hugetlbfs
# mkdir /hugepages
# mount -t hugetlbfs hugetlbfs /hugepages
Состояние страниц можно проверить через /proc/meminfo.
# grep Huge /proc/meminfo
AnonHugePages: 4096 kB
HugePages_Total: 64
HugePages_Free: 64
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Как видно, текущий объем пула составляет 64MB это как раз минимальный указанный объем.
Дальше нужно слегка подправить скрипт запуска postgresql-9.0. Запускать postgres нужно через hugectl. Находим секцию запуска и правим ее до следующего вида
# vi /etc/init.d/postgresql-9.0
start-stop-daemon --start \
--user postgres \
--exec /usr/bin/hugectl \
--env "PGPORT=${configured_port}" \
${extraenv} \
--pidfile ${DATA_DIR}/postmaster.pid \
-- --shm /usr/lib/postgresql-9.0/bin/postgres \
-D ${PGDATA} --data-directory=${DATA_DIR} --silent-mode=true ${PGOPTS}
local retval=$?
Теперь запускаем postgresql и смотрим состояние в /proc/meminfo
# /etc/init.d/postgresql-9.0 start
# grep Huge /proc/meminfo
AnonHugePages: 4096 kB
HugePages_Total: 725
HugePages_Free: 698
HugePages_Rsvd: 698
HugePages_Surp: 661
Hugepagesize: 2048 kB
Как видно заполненность пула изменилась.
Чтобы настройки сохранились после перезагрузки, пропишем настройки в sysctl и применим их.
# vi /etc/sysctl.conf
vm.hugetlb_shm_group = 70
vm.nr_hugepages = 1000
vm.nr_overcommit_hugepages = 1800
# sysctl -p
На этом все.
На главную "Virtualizing Linux"
Комментариев нет:
Отправить комментарий