На одной из моих машин 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.