У меня есть служба Java, которая в настоящее время работает с кучей 14 ГБ. Я очень хочу попробовать опцию -XX:+UseLargePages, чтобы увидеть, как это может повлиять на производительность системы.Я настроил ОС, как описано Oracle, используя соответствующие значения общей памяти и страниц (их также можно рассчитать с помощью онлайн-инструмента).
Как только ОС настроена, я вижу, что она выделяет ожидаемый объем памяти в виде больших страниц. Однако запуск ВМ с установленным параметром -XX:+UseLargePages
всегда приводит к одной из следующих ошибок:
Когда -Xms
/ -Xmx
почти равно выделению огромных страниц:
Failed to reserve shared memory (errno = 28). // 'No space left on device'
Когда -Xms
/ -Xmx
меньше, чем выделению огромных страниц:
Failed to reserve shared memory (errno = 12). // 'Out of memory'
Я пытался ввести некоторую свободу действий - так далее В системе на 32 ГБ я выделил 24 ГБ общей памяти и огромных страниц для использования с JVM, сконфигурированной с кучей на 20 ГБ, из которых в настоящее время используется только 14 ГБ. Я также проверил, что пользователь, выполняющий JVM, имеет групповые права, соответствующие /proc/sys/vm/hugetlb_shm_group
.
Кто-нибудь может подсказать, где я могу ошибаться и что мне делать дальше?
-Xms
/ -Xmx
- 20 ГБ/proc/sys/kernel/shmmax
- 25769803776 ( 24 ГБ)/proc/sys/vm/nr_hugepages
- 12288Спасибо @jfgagneза предоставленный ответ, который привел к решению.В дополнение к
/proc/sys/kernel/shmall
(указывается как страницы размером 4 КБ), мне пришлось добавить записи в /etc/security/limits.conf
, как описано в блоге Томаса. ]. Однако, поскольку мое приложение запускается с использованием jsvc
, мне также пришлось продублировать настройки для пользователя root (обратите внимание, что ограничения указаны в КБ):
root soft memlock 25165824
root hard memlock 25165824
pellegrino soft memlock 25165824
pellegrino hard memlock 25165824
Также стоит упомянуть, что настройки можно было быстро протестировать. запустив JVM с аргументом -version
:
java -XX:+UseLargePages -Xmx20g -version