Gunicorn có 3 worker type chính, mỗi cái hợp một loại workload. sync (mặc định) một request một worker, blocking I/O — đơn giản, hợp CPU-bound hoặc app I/O nhanh. gthread dùng pool thread cho mỗi worker — tốt cho I/O-bound (DB query nhiều, gọi external API). uvicorn.workers.UvicornWorker async, dùng với ASGI app khi cần WebSocket hoặc async view.
gunicorn config.wsgi:application \
--workers 5 \
--worker-class gthread \
--threads 8 \
--bind 0.0.0.0:8000 \
--timeout 30 \
--max-requests 1000 \
--max-requests-jitter 100 \
--access-logfile - --error-logfile -Mấy quy tắc kinh nghiệm: workers = 2 * CPU_cores + 1 (theo Gunicorn docs); threads chỉ dùng với gthread, 4-8 thường đủ; max-requests rotate worker định kỳ để né memory leak (hay gặp với numpy/pandas trong long-running process); timeout phải đủ cho view chậm nhất chạy xong, lâu hơn thì đẩy ra background task chứ đừng tăng timeout tuỳ tiện.
Quá nhiều worker tốn RAM (mỗi worker load một bản app vào memory); quá ít gây backlog dẫn tới 502. Không có "magic number" cho mọi app — đo bằng htop + gunicorn --stats rồi điều chỉnh.