Performance Testing & Optimization Guideï
Guide complet pour tester et optimiser les performances de KoproGo sur un serveur 1 vCPU / 2GB RAM.
đ Nouveau Seed RĂ©alisteï
CaractĂ©ristiquesï
Le nouveau seed seed_realistic gĂ©nĂšre des donnĂ©es proportionnelles Ă la capacitĂ© dâun serveur 1 vCPU :
3 organisations (petite, moyenne, grande)
23 buildings au total
~190 units au total
~127 owners au total
~60 expenses au total
Utilisationï
Option 1: Via lâinterface Superadmin (recommandĂ©)
# Se connecter en tant que superadmin
curl -X POST https://api2.koprogo.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@koprogo.com","password":"admin123"}'
# Utiliser le token reçu pour lancer le seed
curl -X POST https://api2.koprogo.com/api/v1/seed/realistic \
-H "Authorization: Bearer <TOKEN>"
Option 2: Via script bash (nécessite SSH sur le VPS)
cd backend
# Script automatisé
./run-realistic-seed.sh
# Ou manuelle
SQLX_OFFLINE=true cargo build --bin seed_realistic --release
cargo run --bin seed_realistic --release
Option 3: Depuis lâinterface web
Une fois connectĂ© en tant que superadmin dans lâinterface web, accĂ©der Ă la section âSeed Dataâ et cliquer sur âGenerate Realistic Dataâ.
Credentials de Testï
AprĂšs le seed, vous pouvez vous connecter avec :
Organisation |
Password |
|
|---|---|---|
Petite |
|
|
Moyenne |
|
|
Grande |
|
|
đŻ Tests de Charge RĂ©alistesï
Test Mixte POST/GETï
Le nouveau script realistic-load.sh simule un comportement utilisateur réel :
70% lectures (GET) : buildings, units, owners, expenses
30% écritures (POST) : créer des buildings, units, owners, expenses
Distribution pondĂ©rĂ©e par frĂ©quence dâusage
Lancer le Testï
cd load-tests
# Local
export BASE_URL=http://localhost:8080
./scripts/realistic-load.sh
# Production
export BASE_URL=https://api2.koprogo.com
./scripts/realistic-load.sh
Objectifs de Performance (1 vCPU / 2GB RAM)ï
Métrique |
Cible |
Notes |
|---|---|---|
Throughput |
> 200 req/s |
Avec mix 70/30 GET/POST |
P99 Latency |
< 100ms |
Avec écritures |
P50 Latency |
< 30ms |
Médiane |
Error Rate |
< 1% |
Erreurs HTTP 4xx/5xx |
Memory Backend |
< 128MB |
Actuellement ~3.6MB â |
Memory PostgreSQL |
< 512MB |
Actuellement ~64MB â |
Load Average |
< 2.0 |
Actuellement pic Ă 4.81 â ïž |
đ Optimisations RĂ©centesï
1. Indexes PostgreSQLï
Migration 20250103000003_add_performance_indexes.sql :
-- Foreign key indexes (améliore les JOINs)
CREATE INDEX idx_units_organization_id ON units(organization_id);
CREATE INDEX idx_units_building_id ON units(building_id);
CREATE INDEX idx_buildings_organization_id ON buildings(organization_id);
-- Composite indexes (améliore la pagination)
CREATE INDEX idx_units_org_number ON units(organization_id, unit_number);
CREATE INDEX idx_buildings_org_name ON buildings(organization_id, name);
CREATE INDEX idx_owners_org_name ON owners(organization_id, last_name, first_name);
CREATE INDEX idx_expenses_org_date ON expenses(organization_id, expense_date DESC);
-- Auth indexes (améliore login/refresh)
CREATE INDEX idx_refresh_tokens_user_id ON refresh_tokens(user_id);
CREATE INDEX idx_refresh_tokens_expires_at ON refresh_tokens(expires_at) WHERE NOT revoked;
Impact attendu : P99 latency de 801ms â < 50ms
2. Docker Composeï
Traefik :
Memory limit : 50MB â 80MB
Raison : Ătait Ă 77-78% dâutilisation sous charge
3. Dimensionnement des DonnĂ©esï
Ancien seed (trop petit pour ĂȘtre rĂ©aliste) :
3 orgs, 3-4 buildings, ~10 units
Nouveau seed (proportionnel Ă 1 vCPU) :
3 orgs, 23 buildings, ~190 units
Permet de tester les performances avec un volume réaliste
đ Monitoringï
Pendant les Testsï
# Sur le VPS
cd ~/koprogo/load-tests
./monitor-server.sh
MĂ©triques Ă Surveillerï
Métrique |
Normal |
Alerte |
|---|---|---|
Backend CPU |
15-30% |
> 80% |
Backend Memory |
< 50MB |
> 200MB |
PostgreSQL CPU |
20-30% |
> 60% |
PostgreSQL Memory |
< 100MB |
> 400MB |
Traefik Memory |
< 60MB |
> 75MB |
Load Average |
< 1.5 |
> 3.0 |
Disk I/O %util |
< 20% |
> 80% |
RĂ©sultats Monitoring RĂ©centï
Load Average Peak: 4.81 (â ïž trĂšs Ă©levĂ© pour 1 vCPU)
Backend Memory: 3.6MB (â
excellent)
PostgreSQL Memory: 64MB (â
stable)
Traefik Memory: 38MB / 80MB (â
bon avec nouveau limit)
đ§ Workflow de Test Completï
1. PrĂ©parer les DonnĂ©esï
# Sur le VPS via SSH ou localement
cd ~/koprogo/backend
./run-realistic-seed.sh
2. Lancer le Monitoringï
# Terminal 1 : Monitoring
cd ~/koprogo/load-tests
./monitor-server.sh
3. ExĂ©cuter les Testsï
# Terminal 2 : Load tests
cd ~/koprogo/load-tests
export BASE_URL=https://api2.koprogo.com
# Test réaliste mixte
./scripts/realistic-load.sh
# Ou suite complĂšte
./run-all-tests.sh
4. Analyser les RĂ©sultatsï
# Voir les résultats
ls -lth results/
# Dernier test réaliste
cat results/realistic-load_*.txt | tail -30
# Monitoring
cat monitoring-results/server-monitoring_*.log | grep "Load Average\|Backend\|PostgreSQL"
đ Comparaison Avant/AprĂšs Optimisationsï
Avant (seed minimal, pas dâindexes)ï
Throughput: ~312 req/s (GET only)
P99 Latency: 801ms
Error Rate: 0.16%
Load Average Peak: 4.81
AprĂšs (seed rĂ©aliste + indexes) - Ă TESTERï
Throughput attendu: > 250 req/s (mix 70/30)
P99 Latency attendu: < 100ms
Error Rate attendu: < 1%
Load Average attendu: < 2.5
đŻ Prochaines Ătapesï
Déployer les indexes :
# Sur le VPS cd ~/koprogo/backend sqlx migrate run
Lancer le nouveau seed :
./run-realistic-seed.sh
Tester avec le nouveau script :
cd ~/koprogo/load-tests export BASE_URL=https://api2.koprogo.com ./scripts/realistic-load.sh
Comparer les résultats :
P99 latency doit passer de 801ms Ă < 100ms
Throughput doit rester > 200 req/s malgré les POST
Error rate doit rester < 1%
đ Debuggingï
Queries Lentesï
-- Voir les queries les plus lentes
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
Utilisation des Indexï
-- Vérifier qu'un index est utilisé
EXPLAIN ANALYZE
SELECT * FROM units
WHERE organization_id = '...'
ORDER BY unit_number;
Logs Backendï
# Sur le VPS
docker compose -f deploy/production/docker-compose.yml logs -f backend | grep -E "WARN|ERROR|slow"
đ RĂ©fĂ©rencesï
Objectifs P99 : backend/CLAUDE.md (< 5ms target ambitieux)
Config PostgreSQL : deploy/production/docker-compose.yml (tuning pour 1 vCPU)
GitOps Deployment : deploy/production/GITOPS.md
Load Tests : load-tests/README.md