9.4. Проблемы с процессором memory_limiter #

Процессор memory_limiter ограничивает потребление памяти pgpro-otel-collector.

В качестве примера ограничим потребление памяти 2 ГиБ с возможными скачками потребления до 410 МиБ. В этом случае конфигурация будет выглядеть следующим образом:

processors:
  memory_limiter/metrics:
    check_interval: 1s
    limit_mib: 2048
service:
  pipelines:
    metrics:
      processors:
        - memory_limiter/metrics
        - batch/metrics
      ...

Обратите внимание, что memory_limiter добавляется перед batch.

В этой конфигурации коллектор может потреблять до 20% (по умолчанию) больше памяти за счёт параметра spike_limit_mib.

Кроме того, можно использовать переменную окружения GOMEMLIMIT:

  1. Выполните следующую команду:

    sudo systemctl edit --full pgpro-otel-collector.service
  2. В раздел service добавьте следующую строку:

    ...
    Environment="GOMEMLIMIT=1600" # Обязательная строка
    ExecStart=/usr/bin/pgpro-otel-collector --config /etc/pgpro-otel-collector/basic.yml

    Для переменной окружения GOMEMLIMIT задаётся значение в 80% от необходимого ограничения.

Оба этих инструмента позволяют ограничить потребление памяти коллектором в критических ситуациях. Например, когда в базе данных появляется слишком много новых объектов.

Теперь рассмотрим ограничения процессора memory_limiter.

Когда достигается ограничение памяти, все новые записи о метриках сбрасываются, о чём свидетельствует следующее сообщение коллектора:

{
    "level": "warn",
    "ts": "2025-09-22T14:29:46.994+0300",
    "msg": "Memory usage is above soft limit. Refusing data.",
    "resource": {
        "service.instance.id": "f3abd937-782d-4e3d-89fe-8950d54b925e",
        "service.name": "pgpro-otel-collector",
        "service.version": "v0.4.0"
    },
    "otelcol.component.kind": "processor",
    "cur_mem_mib": 908
}

Когда достигается жёсткий предел, в журналах коллектора появляется следующее сообщение:

{
    "level": "warn",
    "ts": "2025-09-22T14:29:49.970+0300",
    "msg": "Memory usage is above hard limit. Forcing a GC.",
    "resource": {
        "service.instance.id": "f3abd937-782d-4e3d-89fe-8950d54b925e",
        "service.name": "pgpro-otel-collector",
        "service.version": "v0.4.0"
    },
    "otelcol.component.kind": "processor",
    "cur_mem_mib": 1026
}

После этого сообщения коллектор запускает сборку мусора. Обратите внимание на то, что дополнительные вызовы сборщика мусора означают дополнительную нагрузку на процессор.

Процессор memory_limiter не обеспечивает полного контроля над потреблением памяти. В некоторых случаях сборщик мусора может не успевать за очисткой памяти из-за высокой нагрузки на процессор.

Рекомендуется установить ограничение в 50% ресурсов сервера. Например, для 8 ГиБ ограничение будет 4 ГиБ.