This commit is contained in:
Tomas Dvorak
2025-11-02 21:31:00 +01:00
parent b9cea0cd77
commit 087f30e82c
130 changed files with 20104 additions and 34330 deletions
+171
View File
@@ -0,0 +1,171 @@
# Docker Performance Optimization Guide
## Summary of Enhancements
### 🚀 Build Performance
- **BuildKit Cache Mounts**: Added persistent caching for Go modules, Go build cache, and npm cache
- **Layer Optimization**: Improved layer ordering to maximize cache hits
- **Build Arguments**: Added inline cache support for better CI/CD performance
- **Binary Optimization**: Added `-ldflags="-w -s"` for smaller Go binaries (~30% reduction)
### 📊 Resource Management
- **CPU Limits**: Set appropriate limits and reservations for each service
- Backend: 2 CPUs max, 0.5 reserved
- Frontend: 1 CPU max, 0.25 reserved
- Database: 2 CPUs max, 0.5 reserved
- **Memory Limits**: Prevents OOM issues and resource contention
- Backend: 1GB max, 256MB reserved
- Frontend: 512MB max, 128MB reserved
- Database: 2GB max, 512MB reserved
### 🗄️ Database Optimization
- **Postgres Tuning**: Production-grade configuration
- `shared_buffers=256MB` - Memory for caching
- `effective_cache_size=1GB` - Query planner optimization
- `work_mem=2621kB` - Per-operation memory
- `max_connections=200` - Connection pool sizing
- `checkpoint_completion_target=0.9` - Smoother checkpoints
- `wal_buffers=16MB` - Write-ahead log buffering
- `random_page_cost=1.1` - SSD-optimized
- **tmpfs Mounts**: Fast temporary storage for `/tmp` and `/var/run/postgresql`
- **Shared Memory**: 256MB for PostgreSQL operations
### 🔄 Startup Optimization
- **Parallel Startup**: Frontend no longer waits for backend health check
- **Faster Health Checks**: Database checks every 5s (was default)
## Usage
### Enable BuildKit (Required)
```powershell
# Set environment variable for BuildKit
$env:DOCKER_BUILDKIT=1
$env:COMPOSE_DOCKER_CLI_BUILD=1
# Or add to your PowerShell profile
Add-Content $PROFILE "`n`$env:DOCKER_BUILDKIT=1"
Add-Content $PROFILE "`$env:COMPOSE_DOCKER_CLI_BUILD=1"
```
### Build with Cache
```powershell
# First build (creates cache)
docker-compose build
# Subsequent builds (uses cache, much faster)
docker-compose build
# Force rebuild without cache
docker-compose build --no-cache
```
### Resource Monitoring
```powershell
# View resource usage
docker stats
# View specific service
docker stats myclub-backend myclub-frontend myclub-db
```
## Performance Benchmarks
### Build Times (Typical)
- **Cold build** (no cache): ~5-8 minutes
- **Warm build** (with cache, no code changes): ~10-30 seconds
- **Incremental build** (small code changes): ~30-60 seconds
### Memory Usage (Expected)
- **Backend**: ~100-300MB during normal operation
- **Frontend**: ~50-100MB (nginx is lightweight)
- **Database**: ~200-800MB depending on data size
## Advanced Optimizations
### Production Deployment
For production, consider:
1. Using multi-stage builds with smaller base images
2. Enabling compression in nginx
3. Adding a reverse proxy (nginx/traefik) in front
4. Using external managed database service
### CI/CD Integration
```yaml
# Example GitHub Actions with cache
- name: Build with cache
uses: docker/build-push-action@v4
with:
context: .
cache-from: type=gha
cache-to: type=gha,mode=max
```
### Windows-Specific Notes
- **WSL2 Backend**: Ensure Docker Desktop uses WSL2 for better performance
- **File Watching**: May be slower on Windows; consider using polling
- **Drive Mounting**: Use WSL2 filesystem for better I/O performance
## Troubleshooting
### Slow Builds
```powershell
# Check if BuildKit is enabled
docker buildx version
# Clear build cache if needed
docker builder prune -a
# Check disk space
docker system df
```
### High Memory Usage
```powershell
# Check current limits
docker-compose config
# Adjust limits in docker-compose.yml deploy.resources section
```
### Database Performance Issues
```powershell
# Connect to database
docker exec -it myclub-db psql -U postgres -d fotbal_club
# Check current settings
SHOW shared_buffers;
SHOW effective_cache_size;
# Monitor queries
SELECT * FROM pg_stat_activity;
```
## Monitoring Performance
### View Logs
```powershell
# All services
docker-compose logs -f
# Specific service
docker-compose logs -f backend
```
### Database Performance
```powershell
# Execute inside container
docker exec -it myclub-db psql -U postgres -d fotbal_club
# Analyze slow queries
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
```
## Next Steps
1. **Monitor**: Use `docker stats` to verify resource usage is within limits
2. **Tune**: Adjust PostgreSQL settings based on your workload
3. **Profile**: Identify bottlenecks using application profiling tools
4. **Scale**: Consider horizontal scaling for production workloads