# ECS Runtime Concurrency Matrix (illustrative, July 2026)

Use as a sizing worksheet — re-measure on your workload.

| Runtime | Concurrency model | First lever | Typical ECS trap |
|---------|-------------------|-------------|------------------|
| PHP-FPM | Process per request | `pm.max_children` vs memory | OOM from too many workers |
| Laravel Octane | In-memory workers | Worker count + sticky state | Shared-memory leaks / mutable globals |
| Node.js | Event loop (+ cluster) | Event-loop lag alert | CPU work blocks all I/O |
| Python sync Gunicorn | Processes | Workers = f(vCPU, RAM) | Memory × workers |
| Python async | asyncio / uvicorn | Concurrent connections per worker | CPU-bound still needs processes |
| Go | Goroutines | GOMAXPROCS / GC | FD ulimit before CPU |

## Monday morning

1. Emit p50/p99 + event-loop lag (Node) or worker saturation (PHP/Python)
2. Set `ulimits.nofile` on ECS task defs for high-conn services
3. Right-size tasks from CloudWatch before copying blog `pm.max_children` values
