首页 > 解决方案 > uWSGI + Flask 请求数据性能问题

问题描述

在将我们的 Flask 应用程序配置为在 uWSGI 中运行时,我遇到了一些性能问题。以前它在一个分离的 tmux 会话中运行,使用:

python application.py run

现在我已经使用以下服务文件将它重新配置为在 uWSGI 中运行:


[Unit]
Description=Flask App
After=syslog.target network.target

[Service]
Type=simple
Restart=always
RestartSec=30
User=nginx
Group=nginx
WorkingDirectory=/var/www/flaskapp
ExecStart=/bin/bash /var/www/flaskapp/run.sh
KillSignal=SIGQUIT

以及以下运行脚本(因为我们在 CentOS 7 上运行 Python 3.8,默认情况下不可用):

source scl_source enable devtoolset-9 rh-python38
source venv/bin/activate
uwsgi --ini uwsgi.ini

以及以下 INI 文件:

[uwsgi]
master = true
thunder-lock = true
http-socket = 0.0.0.0:5000
wsgi-file = application.py
virtualenv = /var/www/flaskapp/venv/
module = application:app
processes = 4
threads = 2
gid = nginx
uid = nginx
chmod-socket = 664
max-requests = 5000
harakiri = 60
socket = %dapp.sock
lazy-apps = true
vacuum = true
enable-threads = true
buffer-size = 32768

一切正常,使用ab进行测试时,我每秒确实有更多的请求,所以基本上一切都很好。但似乎在解析请求正文中的参数时(我们使用调试日志将其固定),每个请求都有一个小的延迟(我猜是 300 到 1000 毫秒之间):

from flask_restful import request
...
args['data'] = request.get_json().get('data')

是否有人知道在 uWSGI 中运行或从 shell 运行有关该请求 JSON 解析时的行为有所不同?例如,尝试打开标准输入的 500 毫秒超时(据我所知,它应该映射到 /dev/null)或什么?或者可能有一些配置错误?

编辑:使用 uWSGI 2.0.19.1 + Python 3.8.6

标签: pythonjsonperformanceflaskuwsgi

解决方案


如果有人正在寻找同样的问题,我找到了解决方案。

正如大多数指南建议在 uWSGI 之上使用 nginx 一样,我尝试了这一点,由于某种原因,在添加了额外的层后性能问题就消失了。

nginx配置:

    location / {
        root /your/path/to/app;
        uwsgi_pass unix:////your/path/to/app/app.sock;
        include uwsgi_params;
    }

uWSGI INI:

[uwsgi]
...
chmod-socket = 664
socket = %dapp.sock
buffer-size = 32768
...

推荐阅读