cb80b35ba6
Frontend CI / build-and-check (push) Failing after 19s
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 8s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 10s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 25s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 2s
121 lines
4.3 KiB
Markdown
121 lines
4.3 KiB
Markdown
# Отчет по нагрузочному тестированию k6
|
||
|
||
Дата отчета: 2026-05-28
|
||
|
||
## Объект тестирования
|
||
|
||
- Стенд: `https://universe.zetcraft.ru`
|
||
- Скрипт: [`frontend/scripts/loadtest-endpoints.js`](../frontend/scripts/loadtest-endpoints.js)
|
||
- Endpoint'ы:
|
||
- `GET /api/v1/courses`
|
||
- `GET /api/v1/lectures`
|
||
- `GET /api/v1/users/me/stats`
|
||
|
||
## Профиль нагрузки
|
||
|
||
Тест запускался в 3 параллельных сценариях:
|
||
|
||
- `courses_list`
|
||
- `lectures_list`
|
||
- `user_stats`
|
||
|
||
Для каждого сценария использовалось `30 VU`, итого максимум `90 VU`.
|
||
Длительность активной нагрузки каждого сценария: `15s`.
|
||
С учетом `gracefulStop` максимальная длительность выполнения составила `45s`.
|
||
|
||
## Оборудование и сеть
|
||
|
||
Тест запускался с машины со следующей конфигурацией:
|
||
|
||
- CPU: AMD Ryzen 7 8845HS, `10` потоков использовалось для нагрузки.
|
||
- RAM: DDR5 5600, `10 GB` доступно.
|
||
- Накопитель: NVMe SSD.
|
||
- Сеть: `1 Gbit/s`.
|
||
|
||
## Критерии прохождения
|
||
|
||
- `checks: rate > 0.95`
|
||
- `http_req_duration: p(95) < 1500ms`
|
||
- `http_req_failed: rate < 0.01`
|
||
|
||
## Прогон 1: без паузы между итерациями
|
||
|
||
Команда запуска:
|
||
|
||
```bash
|
||
BASE_URL="https://universe.zetcraft.ru" VUS=30 DURATION="15s" PAUSE_SECONDS=0 k6 run ./frontend/scripts/loadtest-endpoints.js
|
||
```
|
||
|
||
### Итоги
|
||
|
||
| Метрика | Значение |
|
||
| --- | ---: |
|
||
| Статус threshold'ов | пройдено |
|
||
| Успешность checks | 100.00% |
|
||
| Ошибки HTTP | 0.00% |
|
||
| Всего HTTP-запросов | 3508 |
|
||
| RPS | 77.95 req/s |
|
||
| `http_req_duration` avg | 769.41ms |
|
||
| `http_req_duration` med | 38.67ms |
|
||
| `http_req_duration` p(90) | 66.61ms |
|
||
| `http_req_duration` p(95) | 93.63ms |
|
||
| `http_req_duration` max | 36.14s |
|
||
| Всего итераций | 3508 |
|
||
| Прерванные итерации | 19 |
|
||
| Получено данных | 47 MB |
|
||
| Отправлено данных | 2.1 MB |
|
||
|
||
Проверки:
|
||
|
||
- `status is 200`: успешно.
|
||
- `body is not empty`: успешно.
|
||
|
||
## Прогон 2: пауза 1 секунда между итерациями
|
||
|
||
Команда запуска:
|
||
|
||
```bash
|
||
BASE_URL="https://universe.zetcraft.ru" VUS=30 DURATION="15s" PAUSE_SECONDS=1 k6 run ./frontend/scripts/loadtest-endpoints.js
|
||
```
|
||
|
||
### Итоги
|
||
|
||
| Метрика | Значение |
|
||
| --- | ---: |
|
||
| Статус threshold'ов | пройдено |
|
||
| Успешность checks | 100.00% |
|
||
| Ошибки HTTP | 0.00% |
|
||
| Всего HTTP-запросов | 895 |
|
||
| RPS | 19.89 req/s |
|
||
| `http_req_duration` avg | 336.11ms |
|
||
| `http_req_duration` med | 11.77ms |
|
||
| `http_req_duration` p(90) | 32.01ms |
|
||
| `http_req_duration` p(95) | 42.19ms |
|
||
| `http_req_duration` max | 35.9s |
|
||
| Всего итераций | 895 |
|
||
| Прерванные итерации | 43 |
|
||
| Получено данных | 12 MB |
|
||
| Отправлено данных | 675 kB |
|
||
|
||
Проверки:
|
||
|
||
- `status is 200`: успешно.
|
||
- `body is not empty`: успешно.
|
||
|
||
## Сравнение прогонов
|
||
|
||
| Параметр | Без паузы | Пауза 1s |
|
||
| --- | ---: | ---: |
|
||
| HTTP-запросов | 3508 | 895 |
|
||
| RPS | 77.95 req/s | 19.89 req/s |
|
||
| Ошибки HTTP | 0.00% | 0.00% |
|
||
| Checks | 100.00% | 100.00% |
|
||
| p(95) | 93.63ms | 42.19ms |
|
||
| Максимальная задержка | 36.14s | 35.9s |
|
||
|
||
## Вывод
|
||
|
||
Оба прогона успешно прошли заданные threshold'ы: ошибок HTTP не зафиксировано, все проверки ответов успешны, `p(95)` существенно ниже порога `1500ms`.
|
||
|
||
При запуске без паузы стенд обработал около `77.95 req/s`, при паузе `1s` - около `19.89 req/s`. Во всех прогонах наблюдались единичные длинные запросы до `35-36s`, при этом они не повлияли на прохождение p95-порога. Это стоит учитывать при дальнейшем анализе хвостовых задержек.
|