当前位置: 代码网 > it编程>前端脚本>Python > python之gunicorn配置详解

python之gunicorn配置详解

2025年04月16日 Python 我要评论
python之gunicorn配置起因:因为cpu利用率低导致我去缩容,虽然缩容之后cpu利用率上升维持在60%左右,但是程序响应耗时增加了。解释:因为cpu干这件活本身不累,但在干这件活的时候不能去

python之gunicorn配置

  • 起因:因为cpu利用率低导致我去缩容,虽然缩容之后cpu利用率上升维持在60%左右,但是程序响应耗时增加了。
  • 解释:因为cpu干这件活本身不累,但在干这件活的时候不能去干其他事情,导致并发的请求不能及时响应,导致耗时增加。比如,sleep1s,此时cpu利用率为0,但是cpu却做不了其他的处理。其他任务就被阻塞。
  • 解法:增加cpu的线程数。

但我任务的配置其实是协程,而不是多线程。

gunicorn当worker_class = 'gevent’时,如何增加程序的并发能力?

在 gunicorn 中使用 worker_class = 'gevent'(基于协程的异步 worker)时,提升并发能力的关键在于 合理配置协程并发数优化资源分配

以下是具体方法和步骤:

一、gevent 的并发原理

gevent 通过 协程(coroutine)事件循环(event loop) 实现高并发,每个请求由协程处理而非线程或进程。

协程的切换成本极低,因此适用于 i/o 密集型 场景(如 http api、数据库查询、外部服务调用等)。

二、提升并发能力的核心参数

1. worker 进程数 (--workers/workers)

  • 作用:指定启动的 worker 进程数量。每个 worker 是一个独立进程,内部通过协程处理并发。
  • 建议值:通常设置为 cpu 核心数 × 2 + 1。例如 4 核 cpu 可设 workers = 9
  • 示例
gunicorn --workers=9 --worker-class=gevent app:app

2. 每个 worker 的并发连接数 (--worker-connections/worker_connections)

  • 作用:单个 worker 进程能处理的最大并发连接数。此参数直接影响协程池大小。
  • 建议值:默认 1000,可调整为 1000~5000(需根据内存和负载测试调整)。
  • 示例
gunicorn --workers=9 --worker-class=gevent --worker-connections=2000 app:app

3. 超时时间 (--timeout/timeout)

  • 作用:防止单个请求长时间阻塞协程。
  • 建议值:根据接口响应时间设定(如 --timeout=30 表示 30 秒超时)。

三、完整配置示例

1. 通过命令行启动

gunicorn \
  --workers=9 \                # worker 进程数 = cpu核心数 × 2 + 1
  --worker-class=gevent \      # 使用 gevent worker
  --worker-connections=2000 \  # 每个 worker 的协程并发数
  --timeout=30 \               # 请求超时时间
  --bind=0.0.0.0:8000 \        # 绑定端口
  app:app                      # 应用入口

2. 通过配置文件 (gunicorn.conf.py)

# gunicorn.conf.py
workers = 9
worker_class = "gevent"
worker_connections = 2000
timeout = 30
bind = "0.0.0.0:8000"

启动命令:

gunicorn -c gunicorn.conf.py app:app

四、关键优化点

1. 内存限制

  • 每个 worker 的协程数 (worker_connections) 受内存限制。协程越多,内存占用越高。
  • 监控内存:使用 tophtop 观察进程内存,避免触发 oom(内存不足)。

2. i/o 密集型 vs cpu 密集型

  • i/o 密集型(如 http api、数据库查询):优先增加 worker_connections
  • cpu 密集型(如图像处理、复杂计算):协程无法提升性能,需改用多进程(如 gthread worker)。

3. 数据库连接池

  • 协程并发高时,需确保数据库连接池足够大(如 sqlalchemy 的 pool_size)。

4. 依赖库兼容性

  • 确保所有代码和第三方库兼容 gevent(可能需要 monkey.patch_all())。

5. 启动前添加补丁

# app.py 入口文件顶部
from gevent import monkey
monkey.patch_all()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com