Performance Nginx+;uWSGI&x2B;使用ab进行烧瓶app性能测试
在尝试对我的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平均请求时间=0msPerformance 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应用程序
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