bigywater.tech
Flask · 165

Gunicorn Worker 数量

gunicorn 该开几个 worker?2×核数+1 对不对?计算型和等待型有什么区别?内存怎么算?这篇在 10 核机器上把 worker 数从 1 加到 32,把吞吐、尾延迟与内存画出来。

663
纯 CPU 请求在 worker = 核数(10)时的请求/秒,再加 worker 不再增长
304 → 625
带等待的请求从 10 个到 32 个 worker 的请求/秒
34 MB
最小应用每多一个 worker 增加的内存

实验设置与结果表

实测 · 本机执行输出
   worker 数     /cpu 请求/秒  p99 ms |    /mixed 请求/秒  p99 ms |    空闲内存 MB
          1            98     664 |             28    2311 |         64
          2           191     337 |             57    1147 |         98
          4           374     173 |            114     572 |        166
          8           610     116 |            244     269 |        303
         10           663     107 |            304     223 |        372
         16           658     123 |            479     141 |        573
         32           656     151 |            625     132 |       1120

上一篇:JSON 序列化性能;下一篇:Worker Timeout。

压测工具是系统自带的 ApacheBench,与被测服务同机运行,每个数字只测一次。

分步演示

Gunicorn Worker 数量
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。gunicorn sync worker、ApacheBench、本机 10 核
    • 没有验证:gthread 与 gevent 下线程数与连接数的最优值、真实数据库连接数对 worker 数的限制(第 91 篇)、CPU 超线程的影响、容器的 CPU 限额(cgroup)下的取值、多次重复测量的方差
    京ICP备2026067502号-1京公网安备11010502063487号