V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
V2EX  ›  NGINX

nginx uwsgi django 并发问题

  •  
  •   lazySmeagol · 9 天前 · 524 次点击

    一个 30ms 的只读一次 mysql 的接口,在 4 核 8G 的服务器上并发多少正常,为什么我并发只有 100 左右 uwsgi 配置:

    listen = 4096 chdir = /home/××××× module = app_django.wsgi master = true processes = 4 socket = /××××××/app.sock limit-as = 65535 max-request = 65535 memory-report = true enable-threads = true chmod-socket = 666 vacuum = true

    nginx 配置:

    user nginx; worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;

    error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;

    daemon off; events { use epoll; worker_connections 65535; multi_accept off; }

    http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log  /var/log/nginx/access.log  main;
    
    sendfile        on;
    #tcp_nopush     on;
    
    keepalive_timeout  65;
    
    default_type    application/octet-stream;    
    
    
    upstream django2 {
        server unix:///home/×××/app.sock;
    }
    
    
    
    server {
       listen     80;
        server_name  _;
    
    
      
    
        location /m {
            uwsgi_pass django2;
            include    /home/×××/uwsgi_params;
        }
    
       error_page 404 /404.html;
           location = /40x.html {
            }
    
       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
            }
    
    }
    # Settings for a TLS enabled server.
    

    #gzip  on;
    

    }

    5 回复  |  直到 2017-10-12 17:57:01 +08:00
        1
    javlib   9 天前
    uwsgi processes = 4
    每个请求耗时 30ms,一个 process 一秒可以处理 30 左右的请求,4 个 process 可以处理 120 个请求,差不多。

    既然是 4 核机器,你把 processes 设置成 8 个试试。
        2
    sagaxu   9 天前
    4 核 8G,IO 型应用,process 至少可以写到 50,你先写个 32,不够再加
        3
    lazySmeagol   8 天前
    @sagaxu
    @javlib
    开到 32 并发还是没有变化
    http://chuantu.biz/t6/93/1507791303x3031280623.png
    为什么用 uwsgitop 查看,各个进程处理数量差距那么打
        4
    lazySmeagol   8 天前

    上面是开 4 进程的
    之前说错了,每个耗时应该是 10ms
    开到 32 后单个进程耗时增加,最后总的并发不变,那么瓶颈应该在哪里呢?数据库 io ?磁盘 io ?网络?
        5
    javlib   8 天前
    https://stackoverflow.com/questions/17053426/difference-between-workers-and-processes-in-uwsgi
    uwsgi 的 process 并不是系统进程,而是 uwsgi 的 thread,我看你的截图,应该就是 uwsgi 有一个 master 主进程,然后启动了 32 个 thread,每个 thread 就是一个 uwsgi process,master 主进程负责 32 个 process 的负载均衡。

    从截图看出来,uwsgi 的负载均衡貌似不能很好的把请求平均分配到每个 process。这个在 2013 年的时候也是这样,可能到现在也没有改善( http://cra.mr/2013/06/27/serving-python-web-applications )。

    上面这篇文章也提到了他们的解决方法,就是每个 uwsgi 只开一个 process,然后用 nginx 做负载均衡。也就是在你的 nginx 配置
    ```
    upstream django2 {
    server unix:///home/×××/app.sock;
    }
    ```
    增加多个 server,每个 server 都是完全一样的 uwsgi
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1583 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 38ms · UTC 06:52 · PVG 14:52 · LAX 23:52 · JFK 02:52
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1