技术解析

nginx uwsgi django 并发问题
0
2021-05-20 23:15:48
idczone

一个 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;

}


uwsgi processes = 4
每个请求耗时 30ms,一个 process 一秒可以处理 30 左右的请求,4 个 process 可以处理 120 个请求,差不多。
既然是 4 核机器,你把 processes 设置成 8 个试试。

4 核 8G,IO 型应用,process 至少可以写到 50,你先写个 32,不够再加



开到 32 并发还是没有变化
http://chuantu.biz/t6/93/1507791303x3031280623.png
为什么用 uwsgitop 查看,各个进程处理数量差距那么打


上面是开 4 进程的
之前说错了,每个耗时应该是 10ms
开到 32 后单个进程耗时增加,最后总的并发不变,那么瓶颈应该在哪里呢?数据库 io ?磁盘 io ?网络?

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

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服