nginx uwsgi django 并发问题

2017-10-12 13:49:55 +08:00
 lazySmeagol

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

}

5656 次点击
所在节点    NGINX
5 条回复
javlib
2017-10-12 13:56:28 +08:00
uwsgi processes = 4
每个请求耗时 30ms,一个 process 一秒可以处理 30 左右的请求,4 个 process 可以处理 120 个请求,差不多。

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/397057

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX