Gunicorn 为使用者提供了很多可配置的选项。打开应用的Procfile
文件,你会看到类似web: gunicorn {ARGS}
的命令,那些{ARGS}
就是你的应用所使用的 Gunicorn 配置选项。
一份默认的配置项如下所示:
gunicorn wsgi \
-w 4 \
-b :$PORT \
--access-logfile - --error-logfile - \
--access-logformat '[%(h)s] %({request_id}i)s %(u)s %(t)s "%(r)s" %(s)s %(D)s %(b)s "%(f)s" "%(a)s"'
各配置项含义如下:
-w 4
:启动 4 个 worker 进程-b :$PORT
:监听平台分配的端口 (通过环境变量 PORT 获取)--access-logfile - --error-logfile -
:将访问日志与错误日志往控制台输出--access-logformat '...'
设置日志格式一般来说,上面这份配置可以满足绝大多数应用。但有时,你也可能需要对其做一些调整,下面是一些常见情况。
Gunicorn 默认使用多进程模型来处理请求。在这个模型下,每个请求都是由一个独占的进程来处理的。如果所有请求都可以很快的处理并返回,那么这个模型可以工作的很好。
但如果应用的慢请求过多,使用该模型就可能会出现一些性能问题。
具体表现为:
如何调整
首先,你需要将 Gunicorn 的进程数调大,建议修改为 4。具体操作如下:
-w 4
如果加大进程数后,请求堵塞问题仍然没有改善,那么你可以尝试将工作模型从 prefork 切换为 gevent,后者使用协程模型,在高并发情况下性能表现更好。
具体操作如下:
-k gevent
一个调整了 worker 配置的 Gunicorn 配置如下所示:
gunicorn wsgi \
-w 4 \
-k gevent \
-b :$PORT \
--access-logfile - --error-logfile - \
--access-logformat '[%(h)s] %({request_id}i)s %(u)s %(t)s "%(r)s" %(s)s %(D)s %(b)s "%(f)s" "%(a)s"'
官方文档:workers 选项说明(Settings — Gunicorn 20.0.4 documentation)
为了避免慢请求长时间占用 Worker 资源,Gunicorn 为每次请求设置了最多 30秒 的处理时间限制。当某次请求处理时间超过 30 秒后,就会被强制中断。
出现这种情况时,用户可以从浏览器看到到该请求返回了 502 状态码,应用日志中也可以查询到包含关键字*"Worker Timeout"* 的错误日志。
要解决这类问题,最推荐的做法是优化应用性能,将请求响应时间降低到 30 秒以内。如果因为各种原因无法优化,你也可以把超时时间设置为 1 分钟或者更大的值。
通过增加 --timeout {SECONDS}
选项可以修改默认的请求超时时间。比如 --timeout 120
就是将请求设置为两分钟超时。
官方文档:--timeout 选项说明
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。