...
Настройки сервера по умолчанию в большой степени универсальны и могут нуждаться в подстройке под определенный сценарий клиента.
Оптимизация нагрузки на сервер и потребления памяти
Настройка сборщика мусора
Важной частью Java VM является сборщик мусора (Garbage Collector). При запуске сборщик мусора резко увеличивает нагрузку на сервер и может приостановить выполнение остальных задач, поэтому рекомендуется минимизировать его запуски при помощи следующих настроек в файле wcs-core.properties
Code Block | ||||
---|---|---|---|---|
| ||||
#Disable heuristic rules
-XX:+UseCMSInitiatingOccupancyOnly
#Reduce Old Gen threshold
-XX:CMSInitiatingOccupancyFraction=70
# Use System.gc() concurrently in CMS
-XX:+ExplicitGCInvokesConcurrent
# Disable System.gc() for RMI, for 10000 hours
-Dsun.rmi.dgc.client.gcInterval=36000000000
-Dsun.rmi.dgc.server.gcInterval=36000000000 |
Настройка Z Garbage Collector (ZGC)
Для Java 12 доступна экспериментальная реализации сборщика мусора Z Garbage Collector (ZGC), позволяющая обеспечить низкую задержку при сборке мусора, не останавливая выполнения потоков приложения более чем на 10 миллисекунд, даже при работе с очень большими memory heap. Стоит обратить внимание, что ZGC требует больше ресурсов процессора по сравнению с CMS GC.
Пример установки ZGC с версией OpenJDK 12:
1. Скачиваем последнюю сборку OpenJDK 12 со страницы http://jdk.java.net/12/:
Code Block | ||||
---|---|---|---|---|
| ||||
wget https://download.java.net/java/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_linux-x64_bin.tar.gz |
2. Распаковываемый полученный файл и перемещаем его содержимое в рабочую директория:
Code Block | ||||
---|---|---|---|---|
| ||||
tar xvf openjdk-12.0.2_linux-x64_bin.tar.gz
mv jdk-12.0.2 /usr/java/jdk-12.0.2 |
3. Создаем символические ссылки на OpenJDK 12:
Code Block | ||||
---|---|---|---|---|
| ||||
ln -sf /usr/java/jdk-12.0.2 /usr/java/default
ln -sf /usr/java/default/bin/java /usr/bin/java
ln -sf /usr/java/default/bin/jstack /usr/bin/jstack
ln -sf /usr/java/default/bin/jcmd /usr/bin/jcmd
ln -sf /usr/java/default/bin/jmap /usr/bin/jmap
|
4. Проверяем корректность установки OpenJDK 12:
Code Block | ||||
---|---|---|---|---|
| ||||
java --version
openjdk 12.0.2 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing) |
5. Устанавливаем WCS (если требуется).
6. Добавляем настройки в wcs-core.properties (например, выделяем 24G под heap):
Code Block | ||||
---|---|---|---|---|
| ||||
# ZGC
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms24g -Xmx24g -XX:+UseLargePages -XX:ZPath=/hugepages |
7. Настраиваем ZGC по рекомендациям (число страниц памяти (по 2048K каждая) c запасом на четверть больше, чем получается из расчета памяти под heap (1,25 * 24G / 2M)) и добавляем необходимые параметры в автозагрузку сервера:
Code Block | ||||
---|---|---|---|---|
| ||||
mkdir /hugepages
echo "echo 13051 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" >>/etc/rc.local
echo "mount -t hugetlbfs -o uid=0 nodev /hugepages" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
systemctl enable rc-local.service
systemctl restart rc-local.service |
8. После перезапуска WCS, в файлах логов gc-core.log видна периодическая операция работы сборщика мусора. Для понимания модели работы Z Garbage Collector можно ознакомиться с презентацией.
Настройка оперативной памяти
При стриминге в памяти создается и уничтожается много объектов с данными. Поэтому рекомендуется выделять под Java memory heap не менее, чем 1/2 физической памяти сервера. Например, если объем оперативной памяти сервера составляет 32 Гб, рекомендуется выделить 16 Гб при помощи следующих настроек в файле wcs-core.properties
Code Block | ||||
---|---|---|---|---|
| ||||
-Xmx16g
-Xms16g |
Настройка REST клиента
При использовании REST hooks, на каждое действие WCS сервера (присоединение клиента, публикация и воспроизведение потока, установка звонка и т.д.) создается HTTP REST соединение к бэкенд-серверу. При большом количестве одновременно публикующих клиентов или подписчиков, при настройках по умолчанию возможно исчерпание пула потоков встроенного REST клиента WCS, что, в свою очередь, может приводить к блокировкам (deadlock). При этом сервер перестает публиковать и воспроизводить потоки.
...
Code Block | ||||
---|---|---|---|---|
| ||||
disable_rest_requests=true |
Ограничение логирования
При использовании REST hooks. в серверный лог записывается работа REST-клиента, работа встроенного бэкенда EchoApp, а также работа REST API сервера. Это приводит к большому количеству записей в лог и, следовательно, увеличивает нагрузку на сервер. При необходимости, объем логирования может быть уменьшен при помощи следующих параметров в файле log4j.properties:
...