Gunicorn 或 uwsgi 都比 Django WSGI 服务器慢 ~30 倍

Gunicorn or uwsgi both ~30x slower than Django WSGI server

提问人:Brad Solomon 提问时间:10/31/2019 最后编辑:Brad Solomon 更新时间:11/16/2023 访问量:6062

问:

我有一个 Django 应用程序。它使用 Nginx,位于 EC2 实例上,并在该实例前面使用 AWS 负载均衡器。Nginx 直接从磁盘提供静态文件,并用于其他所有路由到 WSGI 应用程序服务器。proxy_pass

我看到的是WSGI服务器的选择,结果令人费解。

当我使用 Django 的开发服务器时,生成的 HTML 文档的平均响应时间为 60-70 毫秒./manage.py runserver 0.0.0.0:8000/

Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 68 ms
Receiving: 0 ms

现在,当我将其替换为“适当的”Gunicorn 服务器时,同一请求/文档的平均响应时间现在是 1800 毫秒

Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 1859 ms
Receiving: 0 ms

在这里,我将 Gunicorn 运行为:

gunicorn \
    --log-level DEBUG \
    --bind 0.0.0.0:8000 \
    --workers 4 \
    project.wsgi

uwsgi 也是如此,平均响应时间为 1850 毫秒

uwsgi --chdir=/home/ubuntu/project \
    --module=project.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=project.settings \
    --master \
    --http-socket 0.0.0.0:8000 \
    --processes=5 \
    --max-requests=5000 \
    --vacuum

而且,值得注意的是,无论工人数量是否高得多,响应时间都不会改变,例如 (我也不期望它这样做,因为这与并发请求无关)。--workers 64

造成这种差异的原因可能是什么?我是否陷入了一些常见的陷阱?

版本:

$ python -m django --version
2.2.6
$ gunicorn --version
gunicorn (version 19.9.0)
$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
蟒蛇 django python-3.x nginx gunicorn

评论

2赞 brokenfoot 10/31/2019
这可能是由于 gunicorn 的类型吗?我认为默认情况下是.docs.gunicorn.org/en/stable/settings.html#worker-classWORKERCLASSsync
0赞 Brad Solomon 10/31/2019
@brokenfoot是什么意思?我看到默认值是同步,但我从未在任何地方看到它指出,坚持默认值会降低性能
0赞 brokenfoot 10/31/2019
不久前,我运行了一个烧瓶 Web 服务器并看到了同样的问题。然后我将工作类型切换到任何异步选项,它有所作为。你可以试试,看看它是否能加速。gunicorn --log-level DEBUG --bind 0.0.0.0:8000 --workers 4 -k "gevent" project.wsgi
0赞 Brad Solomon 10/31/2019
好的 - 有趣的是,我也看到 uwsgi 的 ~1800 毫秒
0赞 brokenfoot 10/31/2019
我的意思是尝试使用任何异步工作器类型。 似乎是 的替代方案。gunicornuwsgigunicorn

答:

0赞 JW Zhu 11/16/2023 #1

原因或多或少与独角兽worker_class模式有关。如果你把它设置为“gevent”,在我测试它之后,它将执行与Django WSGI服务器相同的速度。

# cat gunicorn_config.py 
worker_class = 'gevent'
workers = 32