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

Bra*_*mon 9 python django nginx python-3.x gunicorn

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

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

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

Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 68 ms
Receiving: 0 ms
Run Code Online (Sandbox Code Playgroud)

现在,当我用“合适的” 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
Run Code Online (Sandbox Code Playgroud)

在这里,我将 Gunicorn 运行为:

gunicorn \
    --log-level DEBUG \
    --bind 0.0.0.0:8000 \
    --workers 4 \
    project.wsgi
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

而且,值得注意的是,无论工作人员的数量是否多得多,响应时间都不会改变,例如--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)
Run Code Online (Sandbox Code Playgroud)

小智 1

原因或多或少与Gunicorn的worker_class模式有关。如果你将其设置为“gevent”,经过我测试,它将执行与Django WSGI服务器相同的速度。

# cat gunicorn_config.py 
worker_class = 'gevent'
workers = 32
Run Code Online (Sandbox Code Playgroud)