Полноценный веб‑сервис, который принимает результаты ступенчатого нагрузочного теста (RPS, avg_ms, max_ms, утилизации) и строит человекочитаемые прогнозы по задержкам (средним и максимальным) и утилизации ресурсов, а также рекомендации по масштабированию.
Интерактивные графики отрисовываются в UI с помощью Plotly.js; серверные шаблоны на Jinja2; валидация входа — Pydantic; математика и подгонка моделей — numpy/pandas/scipy.
- Модели: M/M/1, M/M/c (Erlang C), Kingman (G/G/1), G/G/c (Allen–Cunneen).
- Оценка сервисного времени S и устройств D_i (CPU/RAM/NET) по линейному участку (утилизация vs RPS).
- Прогноз задержек при целевом
target_rps, проверка SLO по максимальной задержке. - Рекомендации по масштабированию: инстансы по CPU/RAM и подбор
cдля M/M/c и G/G/c. - Интерактивные графики: latency vs RPS (+линия SLO), CPU/RAM utilization vs RPS, Network (MB/s) vs RPS, Instances vs RPS.
- Экспорт PDF отчёта (опционально через WeasyPrint).
- REST API (
POST /api/forecast) и OpenAPI (GET /openapi.json).
- Требования: Python 3.10+ (рекомендуется 3.11), macOS/Linux/WSL.
- Установка:
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -r requirements.txt- Запуск в dev‑режиме:
export DEBUG=1
python app.py
# или через gunicorn (как в проде):
# gunicorn -w 4 -b 0.0.0.0:8000 app:app-
Откройте браузер:
http://127.0.0.1:8000 -
На главной странице вставьте JSON (пример:
data/sample.json), задайтеtarget_rpsи нажмите «Рассчитать прогноз».
Примечание (PDF на macOS): для WeasyPrint могут понадобиться системные библиотеки (Pango, Cairo). На macOS можно установить через brew install pango cairo. Если не требуется PDF, WeasyPrint можно пропустить.
docker build -t forecast-svc .
docker run --rm -p 8000:8000 -e PORT=8000 forecast-svcЗатем откройте http://127.0.0.1:8000.
- Flask (роутинг, серверные шаблоны), Jinja2 (рендеринг HTML)
- pandas/numpy/scipy (обработка данных, регрессии, математика очередей)
- Plotly.js (интерактивные графики), Bootstrap 5 (вёрстка)
- Pydantic (валидация входного/выходного JSON)
- WeasyPrint (опционально, экспорт PDF)
- Gunicorn (продовый запуск)
Все необходимые пакеты перечислены в requirements.txt.
app.py— создание Flask‑приложения; HTML‑роуты (/,/forecast,/export/pdf), OpenAPI (/openapi.json),healthz.api.py— REST APIPOST /api/forecast(валидация Pydantic, детальные 400‑ошибки).services/schemas.py— Pydantic‑схемы входа/выхода (InputSchema, ForecastOutput и т.д.).services/models.py— функции моделей (M/M/1, M/M/c, Kingman (G/G/1), G/G/c).services/forecast.py— логика валидации, регрессий и прогноза (Kingman, G/G/c)templates/index.html— главная страница с формой, выбором датасета и подсказками.templates/results.html— отчёт с таблицами и графиками.static/js/app.js— графики Plotly, редактор/валидация JSON (CodeMirror + JSONLint).static/css/style.css— пользовательские стили.data/sample.json— пример входного JSON.tests/test_models.py— базовые тесты моделей/прогноза.Dockerfile— multi‑stage образ для прод‑запуска (gunicorn).
- Таблица «Модели и прогнозы (мс)»
- «Средняя задержка (мс)»: прогноз среднего времени отклика при целевом RPS по каждой модели.
- «Максимальная (мс)»: пиковая задержка, оценивается как средняя × коэффициент (отношение
max_ms/avg_msбазовой ступени). - «Рекомендация»: краткий совет по применимости модели (риск SLO, увеличение
cи т.п.). - Модели: M/M/1, M/M/c (Erlang C), Kingman (G/G/1), G/G/c (Allen–Cunneen).
- Таблица «Параметры и оценки»
S (мс): базовое сервисное время. Оценивается по максимальному наклону утилизаций на линейном участке:S ≈ max(D_i).D_cpu,D_ram(мс/запрос): сервисные требования ресурсов, получаются регрессиейutil ~ rps.Ca,Cs: коэффициенты вариации входа и сервиса (для Кингмана и Allen–Cunneen).- Requests/Limits per pod (если доступны): агрегированные средние значения используются в ресурсной таблице («Kubernetes профиль»).
- График «Задержка vs RPS»
- Точки Observed — фактические средние и максимальные задержки на ступенях теста.
- Линии M/M/1, M/M/c, G/G/1, G/G/c — прогнозы средних задержек по моделям.
- Вертикальная пунктирная — целевой RPS.
- Горизонтальная линия SLO — порог по максимальной задержке (если задан в
target.slo_ms_max_optional).
- График «CPU/RAM утилизация vs RPS»
- Линии CPU и RAM — прогноз утилизаций
U_i = X · D_i. - Горизонтальные пороги
u_max_cpu/u_max_ramпоказывают границы, где потребуется масштабирование.
- График «Сеть (MB/s) vs RPS»
- Линии
net_in_mbps/net_out_mbps; при заданных лимитах — горизонтальныеcap_in/cap_out. - Используйте для выявления сетевых «узких мест» (bottlenecks) и возможного троттлинга.
- График «Инстансы vs RPS»
- Ступенчатые линии показывают необходимое количество инстансов по CPU и RAM.
- Изломы соответствуют событиям масштабирования (увеличение числа инстансов).
Kubernetes-поля (см. data/sample.json):
{
"steps": [
{
"step": "s1",
"rps": 62,
"avg_ms": 540,
"max_ms": 586,
"pods": 2,
"cpu_usage_m": 520,
"cpu_request_m_per_pod": 260,
"cpu_limit_m_per_pod": 1200,
"mem_workingset_mib": 2380,
"mem_request_mib_per_pod": 1290,
"mem_limit_mib_per_pod": 1400,
"net_in_mbps": 12.4,
"net_out_mbps": 8.7,
"concurrency_optional": 33,
"errors_pct": 0.0
}
// ... минимум 2 ступени
],
"target": {
"target_rps": 150,
"slo_ms_max_optional": 200
},
"capacity": {
"u_max_cpu": 0.7,
"u_max_ram": 0.7,
"net_capacity_in_mbps_optional": 200,
"net_capacity_out_mbps_optional": 200,
"mmc_c_optional": 4
},
"modeling": {
"use_m_m_1": true,
"use_m_m_c": true,
"use_kingman": true,
"use_g_g_c": true
}
}Ограничения: `