# Рекомендации для продуктивного контура

Раздел содержит базовые рекомендации по подготовке продуктивного контура Global ERP. Детальные требования к
отказоустойчивости, восстановлению и процедурам переключения приведены в разделе
[Отказоустойчивость и аварийное восстановление Global ERP](040_global-k8s/140_ha-dr.md).

## Отказоустойчивость Kubernetes

Для продуктивного контура рекомендуется использовать отказоустойчивую конфигурацию Kubernetes. Минимальная
рекомендуемая конфигурация для HA - три узла `control-plane`.

Использование трех `control-plane` узлов обеспечивает кворум `etcd` и сохраняет возможность управления кластером при
отказе одного управляющего узла. Один `control-plane` узел не обеспечивает отказоустойчивость управляющего слоя и не
рекомендуется для промышленной эксплуатации.

Worker-узлы должны иметь резерв ресурсов для перераспределения прикладной нагрузки при отказе одного или нескольких узлов.

## Память JVM и лимиты Kubernetes

При настройке pod'ов серверов приложений основным параметром расчета RAM является `Xmx` JVM. Требования к расчету
ресурсов приведены в разделе [RAM](040_global-k8s/050_min_requirements.md#ram), настройка ресурсов pod'ов описана в
разделе [Шаг 4. Настройте группы ресурсов](040_global-k8s/020_install.md#шаг-4-настройте-группы-ресурсов).

Для продуктивных контуров рекомендуется:

- задавать `Xmx` JVM 32 ГБ для одного pod'а;
- задавать `requests.memory` близким к значению `Xmx`;
- задавать `limits.memory` на уровне 48 ГБ или `Xmx + ~20%` для покрытия накладных расходов JVM и процесса контейнера;
- не занижать `requests.memory` относительно фактического потребления pod'а;
- проверять выбранные значения по результатам нагрузочного тестирования и мониторинга JVM-памяти.

Заниженное значение `requests.memory` приводит к некорректному планированию pod'ов Kubernetes. В этом случае несколько
ресурсоемких pod'ов могут быть размещены на одном узле при наличии свободных узлов в кластере, что под нагрузкой
увеличивает риск `OOM`, рестартов и eviction.

## Квоты Global3

Квоты задаются в секции `<quotas>` файла `global3.config.xml` и ограничивают потребление ресурсов внутри сервера
приложений. Подробное описание параметров приведено в разделах [Квоты](110_configs/010_globalConfig.md#квоты) и
[Квоты сервера](130_monitoring_system/010_quotas.md).

Для продуктивного контура рекомендуется использовать настройки с включенным `raiseError="true"`. При таком режиме
превышение квоты завершается ошибкой, а не только записью в журнал. Это ограничивает выполнение операций, которые могут
привести к чрезмерному потреблению памяти, росту времени отклика или деградации соседних пользовательских сессий.

Рекомендуемая начальная конфигурация:

```xml
<quotas>
    <server maxOldGenMemory="0" maxEdenSpaceMemory="80%" raiseError="true"/>
    <session maxUiCellCount="40M" maxFormCount="10" raiseError="true"/>
    <transaction maxTxCellCount="35M" raiseError="true"/>
</quotas>
```

Значения квот являются стартовой рекомендацией для продуктивного контура. Их изменение допускается после анализа
прикладного сценария, результатов нагрузочного тестирования и метрик мониторинга.
