Performance Nginx+;uWSGI&x2B;使用ab进行烧瓶app性能测试

Performance Nginx+;uWSGI&x2B;使用ab进行烧瓶app性能测试,performance,nginx,flask,uwsgi,apachebench,Performance,Nginx,Flask,Uwsgi,Apachebench,在尝试对我的flask应用程序进行基准测试时,我遇到了Nginx+uWSGI+flask的一些问题。正如我的测试所显示的那样,这个组合相当慢。我在Ubuntu 12.04虚拟机上安装了Nginx 1.1.19和uWSGI 2.0,该虚拟机有4个内核和4 GB内存。(Nginx和uWSGI配置如下) 我自己做了一个Nginx的基准测试,它提供了一个静态的20字节文件,我能够获得高达80k req/sec的速度。然后,我做了一个Nginx+uWSGI+的基准测试,这是一个非常基本的flask应用程序

在尝试对我的flask应用程序进行基准测试时,我遇到了Nginx+uWSGI+flask的一些问题。正如我的测试所显示的那样,这个组合相当慢。我在Ubuntu 12.04虚拟机上安装了Nginx 1.1.19和uWSGI 2.0,该虚拟机有4个内核和4 GB内存。(Nginx和uWSGI配置如下)

我自己做了一个Nginx的基准测试,它提供了一个静态的20字节文件,我能够获得高达80k req/sec的速度。然后,我做了一个Nginx+uWSGI+的基准测试,这是一个非常基本的flask应用程序(flask站点上的helloworld示例),我只能获得8k请求/秒的最大值(减少10倍)

我打开了Nginx和uWSGI(加上stats socket)中的日志记录,并格式化日志以打印两者的请求处理时间,以下是我能够收集到的信息:

uWSGI平均请求时间=0ms
Nginx平均请求时间=125ms(Nginx日志时间包括在uWSGI中花费的时间)

我用我的烧瓶应用程序做了同样的测试,结果也遵循同样的模式

uWSGI平均请求时间=4ms
Nginx平均请求时间=815ms

问题:Nginx和uWSGI之间的通信似乎花费了大量时间。以前有人见过这个问题吗???我尝试了Nginx和uWSGI的各种配置,结果都是一样的

请注意,我使用apachebench(ab)在虚拟机本地和远程机器上进行了测试,结果相同

Nginx conf

user www-data;
worker_processes 4;
worker_rlimit_nofile 200000;
pid /var/run/nginx.pid;

events {
        worker_connections  10240;
        #multi_accept on;
        #use epoll;
}

http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 10;
        types_hash_max_size 2048;
        client_body_timeout 10;
        send_timeout 2;
        gzip on;
        gzip_disable "msie6";
        keepalive_disable "msie6";

        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        access_log  off;
        error_log  /var/log/nginx/error.log crit;

        log_format ugzip '$remote_addr - "$request" - $status $body_bytes_sent - [$request_time]';

        ##
        # Virtual Host Configs
        ##
        #include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

        server {
                listen       80;
                server_name  localhost;

                access_log  /var/log/nginx-access.log  ugzip  buffer=32k;
                error_log  /var/log/nginx-error.log;

                location /myapplication {
                        uwsgi_pass     unix:/tmp/bdds.sock;
                        include         uwsgi_params;
                        uwsgi_param UWSGI_SCHEME        $scheme;
                }
        }
}
uWSGI conf(相关部分)

这是Nginx+uWSGI的常见行为吗?我的配置是否明显不正确?我用Ubuntu 12.04在一个4核/4 GB RAM Xen虚拟机上运行这个


提前谢谢

8k每秒的请求并不是那么糟糕,特别是当你与一个20字节的sendfile()服务相比,它基本上都是在没有ipc的ram中发生的。顺便说一句,当您进行基准测试时,您应该从uWSGI中删除任何日志记录,很可能在生产中,您只会记录缓慢或错误的请求。

我猜您每秒发送的请求比您的同步部件(uWSGI+Flask)能够处理的要多得多。这使得请求大部分时间挂起在异步部分(nginx)。

谢谢roberto。我同意你的观点,但我关心的是Nginx和uWSGI(也许还有flask)的结合。即使在日志关闭的情况下,我在ab端看到的reqs/sec数量也大致相同。如果uWSGI处理请求的速度如此之快,为什么它和Nginx之间会有额外的2个数量级延迟?顺便说一句,这些日志只是为了更好地了解所有时间都花在了哪里。正如jwalker所说,你的nginx正在以如此快的速度处理uWSGI,以至于nginx需要等待一个免费的uWSGI工作人员。拥有如此大的侦听队列将避免过早地获得错误,但会在太长时间内隐藏堆栈的不良状态。您是说延迟可能是由于请求在处理之前(发生得相当快)在uWSGI中的某个位置排队造成的吗??有什么方法可以验证这种情况吗?我是说他们在nginx中排队(它是异步的,所以一次可以处理数千个连接),因为uWSGI还没有准备好接受所有连接。另外,我刚刚注意到您有一个巨大的“侦听”设置,它还创建了一个队列,而这个队列您肯定不想要,因为您在nginx中已经有了它。尝试发送稀疏请求,这样他们就不会排队并看到时间安排。谢谢jwalker。事实可能确实如此。
[uwsgi]
master                  = true
listen                  = 40000
chmod-socket            = 666
socket                  = /tmp/bdds.sock
workers                 = 8
harakiri                = 60
harakiri-verbose        = true
reload-mercy            = 8
logto                   = /var/log/uwsgi-app.log
logformat               = %(proto) %(method) %(uri) - %(status) %(rsize) - [%(msecs)]  
vacuum                  = true
no-orphans              = true
#cpu-affinity           = 1
stats                   = /tmp/stats.sock