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

nginx uwsgi django 并发问题

  •  
  •   lazySmeagol · 2017-10-12 13:49:55 +08:00 · 5755 次点击
    这是一个创建于 2604 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个 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
    javlib
        1
    javlib  
       2017-10-12 13:56:28 +08:00
    uwsgi processes = 4
    每个请求耗时 30ms,一个 process 一秒可以处理 30 左右的请求,4 个 process 可以处理 120 个请求,差不多。

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

    上面是开 4 进程的
    之前说错了,每个耗时应该是 10ms
    开到 32 后单个进程耗时增加,最后总的并发不变,那么瓶颈应该在哪里呢?数据库 io ?磁盘 io ?网络?
    javlib
        5
    javlib  
       2017-10-12 17:57:01 +08:00
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3488 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 10:49 · PVG 18:49 · LAX 02:49 · JFK 05:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.