Настройка параметров JVM
SonarQube запускает три JVM-процесса внутри одного Pod — Web server (UI и Web API), Compute Engine (фоновые задачи анализа) и Search component (встроенный Elasticsearch). У каждого из них свой бюджет -Xmx / -Xms. Значения по умолчанию подходят для небольших развертываний, но для более крупных проектов или при более высокой параллельности сканирования часто требуется больше heap для Web или Compute Engine, а heap для Search обычно приходится увеличивать синхронно с ростом числа проектов.
В этом руководстве показано, как задать параметры JVM отдельно для каждого процесса через SonarQube CR и как проверить, что изменения вступили в силу.
Содержание
Предварительные требованияШаг 1 — Задайте параметры JVM в SonarQube CRШаг 2 — Проверьте, что ConfigMap обновленШаг 3 — Перезапустите Pod SonarQubeШаг 4 — Убедитесь, что запущенные JVM используют новые параметрыПримечанияПредварительные требования
- Запущенный экземпляр SonarQube, управляемый этим оператором.
- Доступ на редактирование пользовательского ресурса
Sonarqube. - Ограничения ресурсов контейнера в Pod SonarQube должны быть достаточно большими, чтобы вместить новый бюджет heap — увеличение
-Xmxбез повышения ограничения памяти Pod лишь переносит ошибку OOM на один уровень выше.
Шаг 1 — Задайте параметры JVM в SonarQube CR
Отредактируйте SonarQube CR и добавьте параметры Java для каждого процесса в spec.helmValues.sonarProperties. Эти три имени свойств соответствуют трем процессам SonarQube один к одному:
Пример:
Примените изменения к CR. При следующем reconcile оператор применит их в ConfigMap SonarQube.
Шаг 2 — Проверьте, что ConfigMap обновлен
Процесс SonarQube читает эти параметры из сгенерированного ConfigMap, имя которого заканчивается на -sonarqube-config. Перед перезапуском убедитесь, что новые значения присутствуют:
Если ключи по-прежнему содержат старые значения, подождите несколько секунд, пока оператор выполнит reconcile, и проверьте еще раз. Не переходите дальше, пока ConfigMap не будет содержать новые значения.
Шаг 3 — Перезапустите Pod SonarQube
Параметры JVM считываются при запуске процесса, поэтому новые значения вступят в силу только после перезапуска:
Шаг 4 — Убедитесь, что запущенные JVM используют новые параметры
В UI SonarQube перейдите в Administration → System и разверните разделы Web, Compute Engine и Search. Каждый раздел показывает фактически используемые флаги JVM — убедитесь, что значения -Xmx и -Xms совпадают с теми, которые вы задали на шаге 1.
Из командной строки можно получить те же данные, просмотрев запущенные Java-процессы внутри Pod:
Если новые флаги не отображаются, наиболее вероятная причина — был пропущен шаг 2: Pod был перезапущен до того, как ConfigMap обновился.
Примечания
- О
helmValues.jvmOpts/jvmCeOpts. В старой документации также упоминаются поля уровня chartjvmOptsиjvmCeOpts. В chart, поставляемом вместе с этим оператором, они сохранены для обратной совместимости, но в upstream-файле values помечены как устаревшие, и при одновременной настройке они явно переопределяютсяsonarProperties.sonar.web.javaOpts/sonar.ce.javaOpts. Для процесса Search аналогичного поля chart не существует — используйтеsonarProperties.sonar.search.javaOpts. Для всех трех процессов предпочтительно использовать путьsonarProperties, чтобы конфигурация оставалась согласованной и не терялась при обновлениях chart. - Держите
-Xmxстрого ниже ограничения памяти Pod. Грубое правило:sum(web + ce + search -Xmx) + 25% запас ≤ лимит памяти контейнера. Если задать heap так, что их сумма достигает лимита или превышает его, Pod будет завершаться по OOM, когда JVM законно использует весь свой heap вместе с off-heap памятью. - Heap Search. Elasticsearch работает лучше всего, когда
-Xmsравен-Xmx. Если задать только-Xmxдляsonar.search.javaOpts, heap будет изменять размер во время выполнения, что вызывает кратковременные задержки при больших анализах. HeapDumpOnOutOfMemoryError. При расследовании периодических сбоев OOM для процессов Web и Compute Engine рекомендуется добавить-XX:+HeapDumpOnOutOfMemoryError. Dump будет записан в рабочий каталог SonarQube внутри Pod; скопируйте его с помощьюkubectl cpдо того, как Pod будет пересоздан.