P1: Нагрузочное тестирование IFT (Tsung с дев-машины, 1 нода) #30
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Нужен воспроизводимый нагрузочный прогон backend на IFT: только Traefik + eventhub, генератор с дев-машины. Старый сценарий test/tsung устарел (thinktime в секундах, dummy refresh, один линейный path).
Ожидаемый результат
Критерии приёмки
Приоритет
P1
Беру в работу: prepare/restore IFT + оптимизированные tsung-профили.
Stress hot-path на IFT выполнен (поиск верхней границы, критерий 2A).
Артефакты
test/tsung/eventhub_ift_stress.xml(+ bump)test/tsung/seed-ift-users.sh→ift-users.csv(400 пользователей)test/tsung/summarize-tsung-stress.pyrun-ift-loadtest.sh stressПрогон
~/.tsung/log/20260715-1027/(ladder 0.05→0.006 s, maxusers=5000, без thinktime):Уже на ранней нагрузке без thinktime IFT упёрся: клиент набрал тысячи hung VU, SSH banner/API временно клинили. В XML после прогона:
maxusers=800и более мягкий ladder.Bump-профиль не запускался — граница уже найдена.
Controlled hold на IFT (поиск зелёного потолка).
Профиль:
eventhub_ift_stress_hold.xml(maxusers=300, thinktime=1s, ladder 0.2→0.1→0.05→0.035).Лог:
~/.tsung/log/20260715-1200/.По фазам:
Вывод: на IFT×1 hot-path безопасный режим — до ~10 новых VU/s (при thinktime=1s). Выше — connect/timeout деградация; на 0.05 снова возможен клин SSH (нужен reboot + restore).
Оркестратор:
run-ift-loadtest.sh stress-hold.IFT после последнего reboot восстановлен (eventhub×2, smoke-core OK).
Сравнение controlled hold: eventhub×1 vs ×2 (один и тот же
eventhub_ift_stress_hold.xml).20260715-1200)20260715-1336)Вывод: зелёный потолок тот же (~10 VU/s). Две ноды не поднимают «зелёную» arrival-границу, но заметно смягчают деградацию на 20 VU/s и удерживают прогон ниже порога 2A в среднем. Клин SSH на фазе 0.05 возможен и при ×2 — для hold лучше не заходить выше 0.1 без отдельного лимита.
Hold ×3 (
EVENTHUB_REPLICAS=3, тот жеeventhub_ift_stress_hold.xml), лог~/.tsung/log/20260715-1411/.По connect (фаза → transport):
Overall: BOUNDARY_HIT — 3772× HTTP 429, mean ~44 ms, transport почти нет (19 closed).
Вывод vs ×1/×2: три ноды снимают connect-storm на 20 VU/s; узкое место становится rate limit (429). Зелёный connect-потолок поднимается; «успешный HTTP» потолок упирается в throttle.
Restore: в оркестраторе добавлен fallback WSL→Windows (
restore-ift.ps1). После этого прогона SSH banner снова клинит — нужен reboot + restore.Итог: нагрузочное тестирование IFT завершено
Стенд восстановлен (
eventhub 2/2,traefik 1/1, health API/admin OK).Профили
vmmem/SSHВыводы
wsl --shutdown.Подробный отчёт прикреплён ниже и лежит на exchange-share:
\\192.168.1.116\eventhub-cursor\ift-to-dev\LOADTEST-SUMMARY-2026-07-15.mdFollow-up задачи созданы отдельно (P0/P1/P2). Задачу #30 закрываю.
Итог нагрузочного тестирования IFT (июль 2026)
Профили
Логи восстановления:
\\192.168.1.116\eventhub-cursor\ift-to-dev\wsl-recover-20260715-152148\Выводы
vmmemна хосте; restore через WSL SSH часто мёртв, нужен Windows SSH /wsl --shutdown.Рекомендации (по приоритету)
P0 — стабилизация стенда
restart-wsl-and-collect-logs.ps1/wsl --shutdown, затем restore.update out of sequence(retry/force update сервисов).P1 — приложение / данные (причина 429 и падений под ×3)
archive_managertimeout наget_node("YYYYMM")/peer:start_it— таймауты, пул peer-нод, не блокировать hot-path.P2 — capacity / процесс
maxusers≤300, thinktime≥1s; aggressive без лимита запретить.Повторный hold ×3 после фиксов #32–#34 (2026-07-15)
Образ:
sha-7fa24e831c16(rate limit 2000/1s,MNESIA_DUMP_LOG_WRITE_THRESHOLD=50000, archive async).Профиль:
stress-hold,EVENTHUB_REPLICAS=3.Лог Tsung:
~/.tsung/log/20260715-1845/Архив стенда:
C:\eventhub-cursor-exchange\ift-to-dev\loadtest-20260715-195035\(послеwsl --shutdown— в docker-логах в основном перезапуск, не окно нагрузки).Сравнение с ×3 до фиксов (
20260715-1411)error_timeout)Хронология
maxusers=300+use_controller_vm— предупреждение Tsung; ~194 VU зависли, дальше 0 запросов.wsl --shutdown.Выводы
Mnesia overloaded= 0 (окно нагрузки в них не сохранилось).Следующий шаг (в этой задаче)
Повторить hold ×3 с безопасным потолком VU (снизить
maxusersи/или отдельный client beam), чтобы дойти до фаз 0.05/0.035 без клина контроллера; продолжать записи (collect+анализ по WORKFLOW §7) здесь.Процесс: cleanup дампов + мониторинг; hold maxusers=200
Cleanup на IFT (обязательный gate)
После collect/анализа удалять дампы на стенде, чтобы не забивать FS:
EventHubDevOps/scripts/cleanup-ift-loadtest-dumps.shcleanup-ift-loadtest-dumps.ps1(.cursor/eventhub+ шараscripts/)collect-ift-loadtest-logs.ps1после download чистит remote dump этого stampcollect-*-on-ift.shпосле copy на шару чистит локальный dir+tgzКопии на шаре / Tsung на дев не трогаем. WORKFLOW §7 и README обновлены.
Мониторинг
В анализ добавлен Grafana/Prometheus/Loglynx/observer (после restore).
Во время прогона сейчас prepare гасит observability; для скрейпа mid-run:
KEEP_OBSERVABILITY=1на prepare (оркестратор пробрасывает). На прогоне 1845 мониторинг был выключен — mid-run метрик в Prom нет.Следующий прогон
Рекомендованный вариант:
stress-holdmaxusers=200(XML обновлён),EVENTHUB_REPLICAS=3, лучше сKEEP_OBSERVABILITY=1. Записи продолжаем здесь.Уточнение: метрики бэка (не compose Prometheus)
Compose Prometheus во время 1845 был scale 0 — mid-run там действительно пусто.
Зато сервис EventHub пишет/отдаёт метрики сам:
GET https://api.ift.eventhub.local/metrics— Prometheus text (cowboy_*), без authGET /v1/admin/nodes/metrics?from=&to=— история узлов в Mnesia (admin JWT)Запрос по окну 1845 (15:40–16:35 UTC)
614точек, 2 ноды в выборке (node1/node2; третья в ответах за окно не попала / не писала):Пик CPU ~18:50 MSK совпадает с клином SSH; к 19:10 MSK память гостя почти выжата — хорошо бьётся с Traefik RAM в docker-stats.
В gate/оркестратор: сэмплер
/metrics→~/.tsung/ift-eh-metrics-*.log; в анализе — ещёnodes/metricsпосле прогона. WORKFLOW/README поправлены: compose Prom — опционально.Прогон hold ×3 maxusers=200 (
20260715-2022) — частично / клинПрофиль: stress-hold, replicas=3,
maxusers=200, образsha-7fa24e831c16.Лог:
~/.tsung/log/20260715-2022/Сэмплы:
ift-eh-metrics-…202237.log,ift-docker-stats-…202237.logTsung 2A
/metrics sampler
До ~20:26 MSK counters растут; с 20:27 fetch пустой → API/путь к бэку лёг.
(счётчики cowboy per-replica за LB — не глобальные, тренды по ноде.)
docker-stats
~20:25: eventhub.3 ~96% CPU, Traefik RAM ~2.5 GiB; с 20:27 SSH banner timeout.
Статус стенда
IFT снова клинило (SSH/API). Нужен
wsl --shutdownна HOME-PC → collect + cleanup + restore +nodes/metricsза окно 17:20–17:45 UTC.Вывод
maxusers=200не хватило, чтобы дойти до фаз 0.05/0.035 без клина; 429 по-прежнему нет. Дальше: ещё снизить maxusers (например 100) и/или укоротить/смягчить фазы 3–4.Дополнение к 2022:
nodes/metrics+ артефактыСтенд после restore ожил без ручного
wsl --shutdown. Полныйcollectзавис на docker logs — сняли вручную:C:\eventhub-cursor-exchange\ift-to-dev\loadtest-20260715-2022-partial\(tsung log,/metricssampler, docker-stats,node-metrics.json)/v1/admin/nodes/metrics17:20–17:50 UTCВывод: при maxusers=200 стенд всё равно уходит в CPU/RAM saturation и клин; 429 нет. Следующий шаг — maxusers=100 (и/или смягчить фазы 3–4).
Запускаю hold ×3 с
maxusers=100(образsha-7fa24e831c16). После — стандартный gate: summary, /metrics sampler, nodes/metrics, collect, cleanup, restore.Прогон hold ×3 maxusers=100 (
20260715-2102) — UNDER_THRESHOLDОбраз:
sha-7fa24e831c16, replicas=3.Артефакты:
C:\eventhub-cursor-exchange\ift-to-dev\loadtest-20260715-2102\Tsung 2A
nodes/metrics (18:00–18:13 UTC)
Мягче, чем при maxusers=200 (~100% CPU / ~11 MiB). SSH/restore без клина.
Вывод
stress-hold-beams ×3 (
20260715-2119) — ОТМЕНА / опасноПрофиль
use_controller_vm=false+cpu=2раздул slave beams: concurrent ~4800 VU, freemem контроллера падал до ~0.5–0.6 GiB, Tsung убит (exit 137).Профиль помечен как опасный (нужен
CONFIRM_DANGEROUS=1), не использовать для IFT по умолчанию.Нужен
wsl --shutdownна HOME-PC → collect/restore.Альтернатива для фаз 0.05/0.035: отдельный
stress-hold-hotтолько с этими фазами иuse_controller_vm=true/ maxusers=100 (без slave beams).Логи после wsl --shutdown (
loadtest-20260715-214518)Архив:
C:\eventhub-cursor-exchange\ift-to-dev\loadtest-20260715-214518\(+ tsung20260715-2119). Restore выполнен, smoke зелёный.Важно из eventhub-service.log
MNESIA_DUMP_LOG_WRITE_THRESHOLDне применяется: на всех нодахMnesia dump_log_write_threshold change failed: {error, dump_log_write_threshold}(нужно чинить
infra_mnesia:configure_dump_log/0— параметр/API OTP).Mnesia is overloaded: {dump_log, time_threshold}×4 на node3.exit 255, ошибки Mnesia loader / partitioned network при рестарте — типичный грязный shutdown, не первопричина клина.traefik-service.logпустой (хвост после restart). dmesg без OOM.Стенд готов к
stress-hold-hot.Беру в работу (вариант 1 + лестница реплик).
План
Не трогаем stress-hold-beams без отдельного подтверждения.
Прогон потолка ×1 (после deploy sha-6d8f02d)
stress-hold,EVENTHUB_REPLICAS=1,LOADTEST_TRAEFIK=1~/.tsung/log/20260716-2143/C:\eventhub-cursor-exchange\ift-to-dev\loadtest-20260716-214912Следующее:
EVENTHUB_REPLICAS=2тот же профиль для сравнения репликации.Прогон потолка ×2
stress-hold,EVENTHUB_REPLICAS=2, образsha-6d8f02d~/.tsung/log/20260716-2152/Дальше: ×3.
Прогон потолка ×3
stress-hold,EVENTHUB_REPLICAS=3, образsha-6d8f02d~/.tsung/log/20260716-2200/Сводка лестницы (stress-hold, maxusers=100)
Вывод: на текущем IFT одна нода упирается в latency при ~100 concurrent; ×2/×3 держат hold зелёным. Репликация Mnesia не ухудшает latency — наоборот, снимает потолок одной ноды.
stress-hold-hot ×3
stress-hold-hot(0.1→0.05→0.035),EVENTHUB_REPLICAS=3,sha-6d8f02d~/.tsung/log/20260716-2229/Смысл
На ×3 при лимите 100 concurrent даже «горячий» arrival не пробивает 2A: сервер держит. Узкое место профиля —
maxusers/use_controller_vm, а не backend (в этих рамках). Чтобы давить выше concurrent — нужен другой профиль (осторожно) или поднять maxusers с наблюдением.Baseline IFT (hold): зелёный потолок при ×2/×3 ~100 concurrent / hot-path; ×1 — latency BOUNDARY.
stress-hold maxusers=150 ×3
stress-hold-mu150,EVENTHUB_REPLICAS=3,sha-6d8f02d~/.tsung/log/20260716-2241/Смысл
При 150 concurrent ошибки ещё нет, но к концу фаз ответы уезжают >500 ms → по критерию 2A это уже за границей. Рабочий зелёный concurrent на ×3 остаётся ~100; 150 — мягкий OVER по latency (без клина WSL).
До 200 пока не идём.
Итог — закрываем
На IFT (WSL2) выяснили всё, что стенд позволяет. Дальнейшие абсолютные замеры capacity — на bare Linux (
EventHubDevOps#4).Что выяснили
Prod-ориентир с IFT
Минимум 2 реплики EventHub; VU/CPU с WSL не копировать 1:1.
Baseline зафиксирован в
EventHubSpec/WORKFLOW.md§7 иtest/tsung/README.md.