bigywater.tech
Flask · 167

连接池大小

连接池该设多大?池太小会怎样?worker 数乘池大小超过数据库连接上限又会怎样?这篇用真实的 gunicorn 与 PostgreSQL 把三个问题逐个量出来(池的机制本身见第 91、92 篇)。

41 → 829
pool_size 从 1 到 20 时的请求/秒(每个请求 20 ms)
16 / 300
pool_size=2、pool_timeout=0.5 秒时 32 并发下成功的请求数
270 个失败
4 个 worker × pool 10 超过 max_connections=20 时失败的请求数(400 个里)

池大小决定并发

实测 · 本机执行输出
  pool_size     请求/秒    平均 ms  p95 ms  理想上限(pool/0.02s)
          1       41    732.5     791        50
          2       82    370.0     405       100
          5      214    141.8     159       250
         10      428     70.7      81       500
         20      829     36.5      48      1000

上一篇:Worker Timeout;下一篇:缓存命中率。

池太小加短超时

实测 · 本机执行输出
  300 个请求:成功 16,失败 284({'TimeoutError': 284})

超过数据库连接上限

实测 · 本机执行输出
  400 个请求:成功 130,失败 270;失败原因:{'connection failed: connection to server at "127.0.0.1", port 9478 fail': 270};此刻 PG 上的连接数 psql: error: connection to server at "127.0.0.1", port 9478 failed: FATAL:  sorry, too many clients already

PostgreSQL 是自己起的实例,max_connections 设成 20 来演示。

分步演示

连接池大小
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动。Flask-SQLAlchemy 3.1.1、psycopg 3.3.6、自己起的 PostgreSQL(max_connections=20)、gunicorn gthread
    • 没有验证:PgBouncer 等外部连接池、max_overflow 的取值效果、真实查询耗时分布下的最优池大小、读写分离的多个池、数据库侧每个连接的内存成本
    京ICP备2026067502号-1京公网安备11010502063487号