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

waxmsbnn  于 2023-11-17  发布在  Nginx
关注(0)|答案(1)|浏览(269)

我有一个Django应用。它使用Nginx,位于EC2示例上,并在前面使用AWS负载均衡器。Nginx直接从磁盘提供静态文件,并使用proxy_pass将其他所有内容路由到WSGI应用服务器。
我看到的令人困惑的结果是WSGI服务器的选择。
当我使用Django的开发服务器./manage.py runserver 0.0.0.0:8000时,在/上生成的HTML文档的平均响应时间是60-70 ms

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 ms

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 ms

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)

gstyhher

gstyhher1#

原因或多或少与Gunicorn的worker_class模式有关,如果设置为“gevent”,经过我的测试,它的运行速度和Django WSGI服务器一样。

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

字符串

相关问题