Данный документ описывает инструменты для тестирования производительности системы TJudge.
# Запустить все бенчмарки
make benchmark
# Запустить бенчмарки с интерпретацией
make benchmark-interpret
# Запустить нагрузочные тесты (требуется работающий API)
make test-loadБенчмарки измеряют производительность отдельных компонентов системы.
# Все бенчмарки
make benchmark
# Только API бенчмарки
make benchmark-api
# Только Worker бенчмарки
make benchmark-worker
# Только Queue бенчмарки
make benchmark-queue
# Только Database бенчмарки
make benchmark-db
# С интерпретацией результатов
make benchmark-interpret| Категория | Тесты |
|---|---|
| API | Health endpoint, Auth login, Tournament list, Leaderboard |
| Worker | Throughput (small/medium/large pools), Processing latency, Autoscaling |
| Queue | Enqueue, Dequeue, Priority operations |
| Database | Health check, User lookup, Tournament list, Match creation |
BenchmarkHealthEndpoint-8 50000 23450 ns/op 1024 B/op 12 allocs/op
BenchmarkTournamentsList-8 10000 145230 ns/op 8192 B/op 89 allocs/op
BenchmarkWorkerPool_ThroughputMedium-8 100 15234567 ns/op 102400 B/op 1523 allocs/op
Нагрузочные тесты проверяют поведение системы под высокой нагрузкой.
# Полные нагрузочные тесты
make test-load
# Быстрые тесты
make test-load-quick
# С кастомным URL
LOAD_API_URL=http://localhost:8080 go test -tags=load -v ./tests/load/...| Тест | Concurrency | Duration | Описание |
|---|---|---|---|
| Health Endpoint | 50 | 10s | Базовая проверка throughput |
| Tournaments List | 30 | 10s | Тестирование API listing |
| Auth Login | 20 | 10s | Тестирование аутентификации |
| Mixed Endpoints | 40 | 15s | Комбинированная нагрузка |
| Rate Limiting | 100 | 5s | Проверка rate limiter |
| Sustained Load | 25 | 30s | Длительная нагрузка |
| Burst Traffic | 5x200 | - | Всплески трафика |
=== Health Endpoint Load Test Results ===
Total Requests: 125000
Successful: 124875 (99.90%)
Failed: 125
Avg Latency: 3.45 ms
Min Latency: 1 ms
Max Latency: 156 ms
Requests/sec: 12500.00
================================
Тесты производительности для специфических сценариев.
# Тест турнира с 30 командами
go test -v ./tests/performance/... -run Tournament30Teams
# Тест загрузки программ
go test -v ./tests/performance/... -run Upload30Teams| Тест | Описание |
|---|---|
| Tournament30Teams | Полный цикл турнира с 30 командами |
| Upload30Teams | Загрузка программ от 30 команд |
| UploadTugOfWar | Специфический тест для игры Tug of War |
Тесты устойчивости системы к сбоям.
go test -v ./tests/chaos/...- Отключение БД
- Отключение Redis
- Перезапуск воркеров
- Высокая нагрузка + сбои
Worker и API экспортируют метрики в формате Prometheus.
# Match метрики
tjudge_matches_total{status, game_type}
tjudge_match_duration_seconds{game_type}
tjudge_matches_in_progress
# Queue метрики
tjudge_queue_size{priority}
tjudge_queue_wait_time_seconds{priority}
# Worker метрики
tjudge_active_workers
tjudge_worker_pool_size
# HTTP метрики
tjudge_http_requests_total{method, path, status}
tjudge_http_request_duration_seconds{method, path}
# Database метрики
tjudge_db_query_duration_seconds{query_type}
tjudge_db_connections{state}
# Cache метрики
tjudge_cache_hits_total{cache_type}
tjudge_cache_misses_total{cache_type}
# API метрики
curl http://localhost:8080/metrics
# Worker метрики
curl http://localhost:9091/metrics| Endpoint | Target P95 | Max RPS |
|---|---|---|
| /health | < 10ms | 10000+ |
| /api/v1/tournaments | < 100ms | 1000+ |
| /api/v1/tournaments/{id}/leaderboard | < 200ms | 500+ |
| /api/v1/auth/login | < 500ms | 100+ |
| Метрика | Target |
|---|---|
| Match processing throughput | 100+ matches/sec |
| Queue dequeue latency | < 10ms |
| Autoscaling response time | < 5s |
| Операция | Target P95 |
|---|---|
| Simple SELECT | < 5ms |
| JOIN queries | < 50ms |
| Leaderboard refresh | < 500ms |
- CPU: 4 cores
- RAM: 8 GB
- Docker: 20.10+
- Go: 1.24+
-- Для нагрузочных тестов
ALTER SYSTEM SET max_connections = 200;
ALTER SYSTEM SET shared_buffers = '1GB';
ALTER SYSTEM SET work_mem = '64MB';
ALTER SYSTEM SET maintenance_work_mem = '512MB';maxclients 10000
maxmemory 1gb
maxmemory-policy allkeys-lru
Интерпретатор анализирует результаты и сравнивает с ожидаемыми значениями.
# Запуск бенчмарков с интерпретацией
make benchmark-interpret
# Показать ожидаемые стандарты
go run ./cmd/benchmark -standards
# Только интерпретация (без запуска тестов)
go run ./cmd/benchmark -interpret results.txt=== TJudge Benchmark Results ===
API Benchmarks:
Health Endpoint: 23µs (target: <50µs) ✓
Tournament List: 4.2ms (target: <5ms) ✓
Leaderboard: 8.5ms (target: <10ms) ✓
Worker Benchmarks:
Throughput (100): 95ms (target: <100ms) ✓
Autoscaling: 4.2s (target: <5s) ✓
Queue Benchmarks:
Enqueue: 0.4ms (target: <0.5ms) ✓
Dequeue: 0.3ms (target: <0.5ms) ✓
Overall: 7/7 passed ✓
# Проверить доступность сервисов
curl http://localhost:8080/health
docker exec tjudge-redis redis-cli PING
docker exec tjudge-postgres pg_isready- Проверить наличие rate limiting
- Увеличить connection pool
- Проверить нагрузку на БД
- Проверить количество воркеров
- Проверить индексы в БД
- Проверить hit rate кэша
- Профилировать запросы с pprof
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30go tool pprof http://localhost:6060/debug/pprof/heapgo tool pprof http://localhost:6060/debug/pprof/goroutinecurl -o trace.out http://localhost:6060/debug/pprof/trace?seconds=5
go tool trace trace.outБенчмарки запускаются автоматически в CI pipeline:
# .github/workflows/ci.yml
benchmark:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run benchmarks
run: make benchmark
- name: Interpret results
run: make benchmark-interpretВерсия документации: 3.0