worker数量需匹配应用类型与资源:cpu密集型宜少,i/o密集型可多;建议从4或cpu核数+1起步压测调整,避免硬编码;worker-class须验证是否生效,preload需规避顶层flask上下文调用。

Worker数量设多少才算合理
不是“越多越好”,而是要匹配你的应用类型和服务器资源。CPU密集型任务(比如图像缩放、数值计算)设太多--workers反而引发频繁上下文切换,拖慢整体响应;I/O密集型(比如查数据库、调外部API、读写Redis)才适合靠多worker并发掩盖等待时间。
常见错误现象:压测时CPU跑满但QPS上不去、响应延迟陡增、内存占用异常升高——大概率是--workers设高了,尤其在同步模式下。
- 起始值建议从
4或CPU核心数 + 1开始(例如4核机器用5),再通过压测逐步调整 - 纯I/O场景可试
2 × CPU核心数 + 1,但生产环境不推荐直接套用 - 容器环境慎用硬编码,
psutil.cpu_count()可能返回宿主机核数,建议启动脚本里动态算:--workers $(( $(nproc) * 2 + 1 )) - 超过8个worker后,Gunicorn自身调度开销明显上升,吞吐常不升反降
怎么选Worker类型来放大并发效果
默认的sync worker每个进程一次只处理一个请求,I/O阻塞时完全空转,浪费资源。想真正提升并发能力,必须换worker类型。
常见错误现象:明明开了8个worker,但监控显示并发连接数卡在100以下,日志里大量Connection reset by peer却无实际错误——说明worker被I/O堵死,新请求排队。
-
--worker-class gevent:需安装gevent,配合--worker-connections 1000,单worker可撑上千并发,但要求所有依赖库兼容gevent monkey patch(如某些MySQL驱动不支持) -
--worker-class uvicorn.workers.UvicornWorker:仅限ASGI应用(FastAPI/Starlette),--workers仍需设为具体数值,Uvicorn内部不再管--workers参数 -
--worker-class gthread:启用线程,--threads 4让每个worker并发处理4个请求,适合轻量I/O且不想引入协程依赖的场景
如何确认Worker配置真的生效了
Gunicorn在不兼容时会静默回退到sync,表面启动成功,实际并发能力没变。不能只看进程数,得验证worker class是否真跑起来了。
常见错误现象:加了--worker-class gevent但压测结果和没加一样,ps aux | grep gunicorn看到的全是gunicorn: worker [xxx]——这就是降级了。
- 启动时加
--log-level debug,grep日志里的Using worker: xxx行,确认输出的是你指定的class - 运行中查
ps aux | grep gunicorn,gevent worker进程名应含gevent字样,UvicornWorker应含uvicorn - 用
lsof -p $PID | wc -l对比fd数量:gevent/eventlet通常远高于sync(因协程复用fd),这是最直观的验证方式
Preload引发的Flask上下文错误怎么避
--preload会让Gunicorn在fork worker前先加载一次应用代码,如果代码顶层有直接执行的Flask上下文操作(比如current_app.config、url_for()),就会报Working outside of application context。
常见错误现象:加了--preload后服务启动失败,错误堆栈指向某个模块的顶层代码,但单独运行该模块又没问题。
- 检查所有import的模块,把依赖
current_app或request的逻辑移到视图函数、@app.before_request钩子或工厂函数内部 - 用Flask工厂模式时,确保
create_app()只在worker fork后调用;--preload阶段只import工厂函数,不调用它 - 若需预热缓存等数据,改用
on_starting或when_ready钩子,在worker已初始化但尚未处理请求时执行
真实压测中,worker数、worker class、preload三者经常互相影响。最容易被忽略的是:你以为改了--worker-class就万事大吉,但没验证它是否真生效;或者以为--preload能加速启动,却没清理掉顶层的上下文调用。这些点不排查清楚,调参就是白忙。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











