Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagebash
themeRDark
#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

...

Code Block
languagebash
themeRDark
# Used CMS GC
-XX:+UseConcMarkSweepGC -Xms24g -Xmx24g -XX:NewSize=6144m -XX:MaxNewSize=6144m

# Disable heuristic rules
-XX:+UseCMSInitiatingOccupancyOnly

# Reduce Old Gen threshold
-XX:CMSInitiatingOccupancyFraction=70

# Log
-Xloggc:/usr/local/FlashphonerWebCallServer/logs/gc-core-
-XX:ErrorFile=/usr/local/FlashphonerWebCallServer/logs/error%p.log

...

Пример установки ZGC с версией OpenJDK 12:

1. Скачиваем последнюю сборку OpenJDK 12 со страницы http://jdk.java.net/12/:

Code Block
languagebash
themeRDark
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
languagebash
themeRDark
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
languagebash
themeRDark
ln -sfn /usr/java/jdk-12.0.2 /usr/java/default
ln -sfn /usr/java/default/bin/java /usr/bin/java
ln -sfn /usr/java/default/bin/jstack /usr/bin/jstack
ln -sfn /usr/java/default/bin/jcmd /usr/bin/jcmd
ln -sfn /usr/java/default/bin/jmap /usr/bin/jmap

4. Установите OpenJDK 12, как описано здесь

2. Проверяем корректность установки OpenJDK 12:

Code Block
languagebash
themeRDark
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)

53. Устанавливаем WCS (если требуется).

4.

...

Если WCS был установлен ранее, комментируем или удаляем следующие строки в файле wcs-core.properties

Code Block
themeRDark
-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails

Заменяем строку

Code Block
themeRDark
-Xloggc:/usr/local/FlashphonerWebCallServer/logs/gc-core-

на

Code Block
themeRDark
-Xlog:gc*:/usr/local/FlashphonerWebCallServer/logs/gc-core-:time

5. Добавляем настройки в wcs-core.properties (например, выделяем 24G под heap):

  • в JDK 12-15
Code Block
languagebash
themeRDark
# ZGC
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms24g -Xmx24g
  • в JDK 16 и выше
Code Block
languagebash
themeRDark
# ZGC
-XX:+UseZGC -Xms24g -Xmx24g

6. Если планируется использование больших страниц памяти (hugepages), добавляем настройки:

  • в JDK 12 или 14
Code Block
themeRDark
-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
themeRDark
 -XX:+UseLargePages -XX:AllocateHeapAt=/hugepages

Затем настраиваем hugepages по рекомендациям (число страниц памяти (по 2048K каждая) c запасом на четверть больше, чем получается из расчета к выделенной памяти под heap (1,25 125 * 24G *1024 / 2M)) и добавляем необходимые параметры в автозагрузку сервера (пример для Centos):

Code Block
languagebash
themeRDark
sudo mkdir /hugepages
sudo echo "echo 1305113824 >/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
themeRDark
#
# 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
languagebash
themeRDark
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
themeRDark
-Xlog:gc,gc+start,gc+phases:/usr/local/FlashphonerWebCallServer/logs/gc-core-:time