...
5. Добавляем настройки в wcs-core.properties (например, выделяем 24G под heap):
- в JDK 12-15
Code Block | ||||
---|---|---|---|---|
| ||||
# ZGC -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms24g -Xmx24g |
- в JDK 16 и выше
Code Block | ||||
---|---|---|---|---|
| ||||
# ZGC -XX:+UseZGC -Xms24g -Xmx24g |
6. Если планируется использование больших страниц памяти (hugepages), добавляем настройки:
- в JDK 12 или 14
Code Block | ||
---|---|---|
| ||
-XX:+UseLargePages -XX:ZPath=/hugepages # Log -Xlog:gc*:/usr/local/FlashphonerWebCallServer/logs/gc-core.log -XX:ErrorFile=/usr/local/FlashphonerWebCallServer/logs/error%p.log |
...
- в JDK 15 и выше
Code Block | ||
---|---|---|
| ||
-XX:+UseLargePages -XX:AllocateHeapAt=/hugepages |
Затем настраиваем hugepages по рекомендациям (число страниц памяти (по 2048K каждая) c запасом к выделенной памяти под heap (1,125 * 24G *1024 / 2M)) и добавляем необходимые параметры в автозагрузку сервера (пример для Centos):
Code Block | ||||
---|---|---|---|---|
| ||||
sudo mkdir /hugepages sudo echo "echo 13824 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" >>/etc/rc.local sudo echo "mount -t hugetlbfs -o uid=0,mode=0757 nodev /hugepages" >>/etc/rc.local sudo chmod +x /etc/rc.d/rc.local sudo systemctl enable rc-local.service sudo systemctl restart rc-local.service sudo chmod o+w /hugepages |
7. После перезапуска WCS, в файлах логов gc-core.log видна периодическая операция работы сборщика мусора. Для понимания модели работы Z Garbage Collector можно ознакомиться с презентацией.
Настройка выделения и освобождения физической памяти на уровне системы
При большой нагрузке на сервер, может оказаться недостаточно областей маппинга физической памяти (memory map areas), выделяемых процессу системой по умолчанию, что может приводить к завершению работы JVM по нехватке нативной памяти. При этом лог ошибки будет содержать следующий комментарий
Code Block | ||
---|---|---|
| ||
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 12288 bytes for committing reserved memory.
# Possible reasons:
# The system is out of physical RAM or swap space
... |
Для того, чтобы предотвратить такое поведение, необходимо увеличить количество областей маппинга памяти
Code Block | ||||
---|---|---|---|---|
| ||||
sysctl -w vm.max_map_count=131072 |
и перезапустить WCS.
Известные проблемы
1. При использовании ZGC нагрузка на процессор сервера выше, особенно в JDK 15
Симптомы: при обновлении JDK c 12 или 14 до 15 и использовании ZGC возрастает средняя загрузка процессора, измеренная на уровне системы (например, утилитой htop)
Решение: для высоконагруженных серверов, если требуется минимизация задержек при сборке мусора, использовать ZGC в JDK 12 или 14
2. Логи ZGC с настройками вывода по умолчанию могут занимать много места на диске
Симптомы: файлы логов gc-core*.log
занимают много места на диске
Решение: в файле настроек wcs-core.properties ограничить набор сообщений, выводимых в лог сборщика мусора
Code Block | ||
---|---|---|
| ||
-Xlog:gc,gc+start,gc+phases:/usr/local/FlashphonerWebCallServer/logs/gc-core-:time |