Ресурсы и лимиты trace-агента
На этой странице:
- Что ограничивается
- Память: max_memory
- CPU: max_cpu_percent
- Соединения: connection_limit
- Параллельный разбор запросов: decoders и decoder_timeout
- Размер и время запроса
- Справочник параметров
- Признаки достижения лимитов
Что ограничивается
trace-агент — компонент агента ProtoOBP, который принимает трейсы от трейсеров приложений (порт 8126) и отправляет их на ProtoOBP Backend. Чтобы всплеск трафика от приложений не повлиял на хост, у trace-агента есть защитные ограничения двух видов:
- ресурсы самого trace-агента — память и CPU;
- приём запросов от трейсеров — число соединений, параллельный разбор, размер и время запроса.
Объём сохраняемых трейсов регулируется отдельно — сэмплированием (apm_config.target_traces_per_second, apm_config.errors_per_second), см. Управление сэмплированием трейсов.
Все параметры задаются в секции apm_config файла protoobp.yaml или переменными окружения POBP_APM_* и вступают в силу после перезапуска агента.
Память: max_memory
apm_config:
max_memory: 1000000000 # байт; 0 — без ограничения
- По умолчанию
500000000(500 МБ) при установке пакетом на Linux и Windows. - Если trace-агент занимает в памяти больше полутора значений
max_memory, он завершается с сообщениемKilling process. Memory threshold exceededв журналеtrace-agent.logи перезапускается службой. Трейсы, накопленные в памяти на этот момент, теряются. - В контейнере (Docker, Kubernetes) ограничение по умолчанию отключено: памятью управляют лимиты контейнера. Если задать
max_memoryявно, оно действует и в контейнере.
Если в журнале повторяется Memory threshold exceeded, поднимите max_memory или снизьте поток трейсов сэмплированием на стороне трейсеров.
CPU: max_cpu_percent
apm_config:
max_cpu_percent: 200 # процентов одного ядра; 0 — без ограничения
- По умолчанию
50при установке пакетом. - Значение ограничивает число ядер, на которых trace-агент одновременно выполняет работу:
max_cpu_percent / 100с округлением вниз, но не меньше одного ядра.50и150дают одно ядро,200— два. - Ограничение не применяется, если число ядер уже задано лимитами CPU контейнера или переменной окружения
GOMAXPROCS. - В контейнере по умолчанию отключено.
Если приложения на хосте отправляют много трейсов, а trace-агент упирается в одно ядро (растёт задержка ответа трейсерам, появляются отказы в приёме), увеличьте значение до 200–400.
Соединения: connection_limit
apm_config:
connection_limit: 2000
Сколько новых TCP-соединений trace-агент принимает за 30 секунд (по умолчанию 2000). Когда лимит исчерпан, новые соединения отклоняются до начала следующего 30-секундного периода; уже открытые соединения продолжают работать.
Лимит защищает от приложений, которые открывают новое соединение на каждый запрос. Долгоживущие приложения обычно переиспользуют соединения с агентом, и при штатной работе лимит не достигается. Если хост принимает трейсы от очень большого числа короткоживущих процессов (например, CGI или PHP без постоянного процесса), увеличьте значение.
Значение 0 отключает лимит на новые соединения; тогда действует ограничение на число одновременных соединений max_connections (по умолчанию 1000).
Параллельный разбор запросов: decoders и decoder_timeout
Принятые запросы trace-агент разбирает в нескольких параллельных обработчиках (decoders, по умолчанию — половина ядер, доступных trace-агенту с учётом max_cpu_percent, но не меньше одного). Если все обработчики заняты дольше decoder_timeout миллисекунд (по умолчанию 1000), запрос отклоняется, а трейсы из него не сохраняются.
По умолчанию трейсер получает в ответ на отклонённый запрос код 200, чтобы не повторять отправку и не усугублять перегрузку. Чтобы трейсеры получали 429 Too Many Requests и это было видно в их журналах, включите:
apm_config:
features: ["429"]
Отклонения из-за занятости обработчиков — признак нехватки CPU: сначала увеличьте max_cpu_percent, затем при необходимости decoders.
Размер и время запроса
| Параметр | По умолчанию | Назначение |
|---|---|---|
max_payload_size | 26214400 (25 МиБ) | Максимальный размер запроса от трейсера, байт. Больший запрос отклоняется с кодом 413 |
receiver_timeout | 5 | Время на чтение запроса от трейсера, секунд |
Запросы больше 25 МиБ обычно означают трейсы с очень большими тегами (тела запросов, SQL-тексты) — ограничьте их размер в настройках трейсера, а не поднимайте лимит.
Справочник параметров
Параметр apm_config.* | Переменная окружения | По умолчанию |
|---|---|---|
max_memory | POBP_APM_MAX_MEMORY | 500000000; в контейнере — без ограничения |
max_cpu_percent | POBP_APM_MAX_CPU_PERCENT | 50; в контейнере — без ограничения |
connection_limit | POBP_APM_CONNECTION_LIMIT | 2000 за 30 с |
max_connections | POBP_APM_MAX_CONNECTIONS | 1000 (действует при connection_limit: 0) |
decoders | POBP_APM_DECODERS | половина доступных ядер, не меньше 1 |
decoder_timeout | POBP_APM_DECODER_TIMEOUT | 1000 мс |
max_payload_size | POBP_APM_MAX_PAYLOAD_SIZE | 26214400 байт |
receiver_timeout | POBP_APM_RECEIVER_TIMEOUT | 5 с |
features | POBP_APM_FEATURES | — (429 — отвечать трейсерам кодом 429 при отказе) |
Признаки достижения лимитов
| Признак | Лимит | Что делать |
|---|---|---|
Killing process. Memory threshold exceeded в trace-agent.log, частые перезапуски trace-агента | max_memory | Поднять max_memory или снизить поток трейсов |
Трейсы приходят с пропусками при пиковой нагрузке; при log_level: debug в журнале trace-agent is overwhelmed, a payload has been rejected | decoders, max_cpu_percent | Увеличить max_cpu_percent, затем decoders |
Ошибки соединения у трейсеров на порт 8126 при большом числе короткоживущих процессов | connection_limit | Увеличить connection_limit |
Код 413 в журнале трейсера | max_payload_size | Ограничить размер тегов в трейсере |
Состояние trace-агента видно в разделе APM Agent вывода protoobp-agent status — см. Команды и проверка работы. Если трейсы теряются, а лимиты не достигнуты, проверьте сэмплирование.