首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Nginx作为Sanic + Gunicorn反向代理时性能下降

使用Nginx作为Sanic + Gunicorn反向代理时性能下降
EN

Stack Overflow用户
提问于 2019-01-31 06:47:17
回答 1查看 2.5K关注 0票数 1

我刚刚开始学习Sanic框架,因为它具有快速的基准。我做了一个简单的hello world API,然后将它与Gunicorn连接起来。表演相当不错,但当我把它和Nginx结合起来时,它变得非常糟糕。我发现使用Nginx的Gunicorn进程被限制为每个进程的CPU资源的1% - 4%。在没有Nginx的情况下,Gunicorn可以达到每个过程的10%。我以为是因为Nginx配置错误。有人能给我一些建议吗?

服务器信息:

代码语言:javascript
复制
OS: Ubuntu 18.04    
Python version: 3.7.2    
Sanic version: 18.12.0    
Processor: i3-4130

Sanic + Gunicorn表演:

代码语言:javascript
复制
wrk -t8 -c1000 -d60s --timeout 2s http://127.0.0.1:8080/
Running 1m test @ http://127.0.0.1:8080/
  8 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    29.54ms   15.13ms 175.77ms   71.23%
    Req/Sec     4.32k     1.29k   19.46k    64.77%
  2060010 requests in 1.00m, 249.50MB read
Requests/sec:  34281.64
Transfer/sec:      4.15MB

Sanic + Gunicorn + Nginx性能:

代码语言:javascript
复制
wrk -t8 -c1000 -d60s --timeout 2s http://127.0.0.1:8081/
Running 1m test @ http://127.0.0.1:8081/
  8 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   364.78ms  271.20ms   1.39s    67.53%
    Req/Sec   370.88    251.66     3.52k    87.12%
  177223 requests in 1.00m, 30.42MB read
Requests/sec:   2948.79
Transfer/sec:    518.25KB

Sanic应用程序:

代码语言:javascript
复制
from sanic import Sanic
from sanic.response import json


app = Sanic()
app.config.ACCESS_LOG = False

@app.route("/")
async def test(request):
    return json({"hello": "world"})

Gunicorn命令:

代码语言:javascript
复制
gunicorn --bind 127.0.0.1:8080 --workers 8 --threads 4 app:app --worker-class sanic.worker.GunicornWorker --name SanicHelloWorld

全局Nginx配置:

代码语言:javascript
复制
worker_processes 8;
worker_rlimit_nofile 400000;
thread_pool sanic_thread_pool threads=32 max_queue=65536;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    multi_accept on;
    worker_connections 25000;
    use epoll;
    accept_mutex off;
}

http {
    access_log off;
    sendfile on;
    sendfile_max_chunk 512k;
    tcp_nopush on;
    tcp_nodelay on;
    server_names_hash_bucket_size 64;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_redirect off;

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

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    upstream sanic-test {
        server 127.0.0.1:8080;
    }
}

Sanic +Gunicorn:Nginx配置:

代码语言:javascript
复制
server {
    listen 8081;
    listen [::]:8081;

    server_name sanic-test.com www.sanic-test.com;

    location / {
        aio threads=sanic_thread_pool;
        proxy_pass http://127.0.0.1:8080;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-02-04 23:04:24

这可能是因为默认情况下buffering设置为on,例如,当您使用pass时。

通常,nginx应该控制后端的背压,因此,缓冲是完全合理的,因为您不希望真正的后端受制于Slowloris攻击矢量。同样,您应该进行缓存并限制连接到nginx后面的真正后端的数量,因此,您的测试--将所有内容设置为最大,但未能禁用缓冲--在现实场景中只是一个不现实的条件,因此,您在度量中得到了非常糟糕的数字。

如果您只想通过向HTTP堆栈添加另一个层来查看性能受到多大的影响,那么在使用proxy_buffering off;时应该设置proxy_pass。否则,测试应该更加现实:您的真正后端不应该比path指定的存储设备的IO参数每秒处理更多的请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54454841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档