ps -ef | grep nginx
|
master进程
| | |
有信号 有信号 有信号
| | |
worker进程 worker进程 worker进程——————>回master进程争抢
| | | | | |
连接 连接 连接 连接 连接 连接
| | | | | |
tomcat tomcat tomcat tomcat tomcat tomcat
| | | | | |
Client Client Client Client Client Client
每个worker进程是独立的进程,不需要加锁,省掉锁带来的开销
同时在编程以及问题查找时,也会方便很多。
独立的进程,让互相之间不会影响,一个进程退出后,其它进程还在工作服务不会中断,master进程则很快启动新的worker 进程
worker进程的异常退出,肯定是程序有bug了
异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
与Redis相似,io多路复用(win不能最大化)
每个worker都是独立一个进程
一个进程里只有一个主线程,通过异步非阻塞的方式来处理请求
即使是千上万个请求也不在话下
每个worker的线程可以把一个cpu的性能发挥到极致。
所以worker数和服务器的cpu数相等是最为适宜的。
设少了会浪费gu,设多了会造成cpu频繁切换上下文带来的损耗。
设置worker数量。
worker processes 4
work绑定cpu(4work绑定4cpu)。
worker. cpu affinity 0001 0010 0100 1000
每个worker进程能建立的最大连接数,应该是
worker_connections * worker_processes
4 * 1024 = 4096
1024我猜的是1个线程最小占1m
支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是:
worker connections * worker processes /2
client抢到手worker - 1次
worker返回client - 1次
HTTP作为反向代理来说,最大并发数量应该是
worker connections * worker_processes/4
因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
client抢到手worker - 1次
worker转tomcat - 1次
tomcat返回worker - 1次
worker返回client - 1次