Назад | Перейти на главную страницу

Включение HugePages в Linux для нескольких сервисов / процессов

На одной из моих машин Debian я запускаю службу на JVM и экземпляре MySQL. Я включил HugePages, следуя различным онлайн-руководствам, но у меня проблема.

Вот моя конфигурация:

vm.nr_hugepages = 2816
vm.nr_overcommit_hugepages = 128
vm.hugetlb_shm_group = 1002
kernel.shmmax = 5905580032
kernel.shmall = 1441792

ОБНОВИТЬ: Моя машина - это гостевая виртуальная машина поверх VMWare ESX, с назначенными двумя процессорами и 6 ГБ оперативной памяти. Я зарезервировал 512 МБ или ОЗУ для системы, а остальные (5,5 ГБ, 5905580032 байта, как показано на kernel.shmmax) назначается 3 ГБ для JVM и 2,5 ГБ для MySQL. Поэтому я зарезервировал 5,5 ГБ / 2 МБ = 2816 огромных страниц.

Доступ к памяти разрешен для группы «услуги» (gid = 1002). MySQL и JVM запускаются с разными пользователями, которые оба являются членами этой группы «services» в качестве основной группы:

uid=106(mysql) gid=1002(services) groups=1002(services),111(mysql)
uid=1001(java) gid=1002(services) groups=1002(services),1003(java)

HugePages включены, и они работают. Проблема в том, что только одно приложение за раз похоже умеет ими пользоваться! Если я сначала запустил mysql, то jvm не сможет его использовать, и наоборот.

service mysql start -> OK
service java start -> Fallback to normal memory

или

# service java start -> OK
# service mysql start -> Failure, can't allocate memory

Как мне это сделать? Я где-то ошибаюсь? Можно ли это вообще сделать?

Нет требований создавать отдельную машину для Java и для MySQL, поэтому я очень хочу, чтобы обе службы были на одной машине.

ОБНОВИТЬ: В настоящий момент я занимаюсь профилированием памяти, чтобы решить, лучше ли выделить HugePages для JVM или для MySQL. Или на это есть быстрый ответ?

Спасибо

Вы не упоминаете версию своего дистрибутива / ядра, но, возможно, стоит отметить, что в последних ядрах (2.6.38+) есть функция, называемая прозрачными огромными страницами.

Вы можете узнать, включен ли он, используя:

cat /sys/kernel/mm/transparent_hugepage/enabled

Это в значительной степени берет на себя всю эту нагрузку по управлению и предварительному распределению огромных страниц с вами.

Вы можете увидеть, сколько памяти выделено, используя какой размер страницы, запустив

cat /proc/meminfo | grep AnonHugePages

или

egrep 'trans|thp' /proc/vmstat

на использование процесса

grep -e AnonHugePages  /proc/*/smaps | awk  '{ if($2>4) print $0} ' |  awk -F "/"  '{print $0; system("ps -fp " $3)} '

Последние три команды взяты из Поддержка RHEL6

Интересный Информация на прозрачных HugePages и JVM.