mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
172 lines
4.6 KiB
Markdown
172 lines
4.6 KiB
Markdown
# 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
|