我试图得到一个非常高性能的web服务器设置处理长轮询,websockets等。我有一个虚拟机运行(Rackspace)与1GB内存/ 4核心。 我已经设置了一个非常简单的gunicorn'hello world'应用程序和(asynchronous)gevent工作者。 在gunicorn之前,我把Nginx和Gunicorn简单的代理放在一起。 使用ab
,Gunicorn吐出7700个请求/秒 ,其中Nginx只有5000个请求/秒 。 预期这种性能下降了吗?
你好,世界:
#!/usr/bin/env python def application(environ, start_response): start_response("200 OK", [("Content-type", "text/plain")]) return [ "Hello World!" ]
Gunicorn:
gunicorn -w8 -k gevent --keep-alive 60 application:application
Nginx(剥离):
user www-data; worker_processes 4; pid /var/run/nginx.pid; events { worker_connections 768; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; upstream app_server { server 127.0.0.1:8000 fail_timeout=0; } server { listen 8080 default; keepalive_timeout 5; root /home/app/app/static; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } } }
基准:(结果: nginx TCP , nginx UNIX , gunicorn )
ab -c 32 -n 12000 -k http://localhost:[8000|8080]/
在unix插槽上运行gunicorn可以获得更高的吞吐量( 5500 r / s ),但它仍然不符合gunicorn的性能。
对于gunicorn,您可以使用以下命令将连接超时时间缩短为0秒:
http://docs.gunicorn.org/en/latest/settings.html#timeout
您也可以使用keep_alive作为proxy_pass后端使用此指令: http ://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
请注意,keep alive指令在较早的nginx版本中不可用
Nginx不使用keepalive与后端,所以你应该禁用它在gunicorn。 另外我会开始testing1个worker的nginx,这样它就不会和gunicorn竞争一个免费的cpu。 如果回收速度不够快,您可能需要增加工人连接。
而且,由于nginx引入了自己的延迟(尽pipe很低),所以你永远不会达到和raw gunorn相同的性能。 你可以直接使用nginx在另一个域中使用gunicorn和静态资源来为你的应用程序提供服务,这有一些优点,比如cookie清理stream量。