一个 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;
}
1
javlib 2017-10-12 13:56:28 +08:00
uwsgi processes = 4
每个请求耗时 30ms,一个 process 一秒可以处理 30 左右的请求,4 个 process 可以处理 120 个请求,差不多。 既然是 4 核机器,你把 processes 设置成 8 个试试。 |
2
sagaxu 2017-10-12 14:00:42 +08:00
4 核 8G,IO 型应用,process 至少可以写到 50,你先写个 32,不够再加
|
3
lazySmeagol OP @sagaxu
@javlib 开到 32 并发还是没有变化 http://chuantu.biz/t6/93/1507791303x3031280623.png 为什么用 uwsgitop 查看,各个进程处理数量差距那么打 |
4
lazySmeagol OP 上面是开 4 进程的 之前说错了,每个耗时应该是 10ms 开到 32 后单个进程耗时增加,最后总的并发不变,那么瓶颈应该在哪里呢?数据库 io ?磁盘 io ?网络? |
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 |