在正式提供产品的环境下,部署nginx都是使用master进程来管理多个worker进程.
一般情况下,worker进程都与服务器上的核数相等,每一个worker进程都是繁忙的,它们真正的提供互联网服务.
而master进程则很清闲,只负责监控管理worker进程.
worker进程之间通过共享内存,原子操作等一系列进程之间的通讯来实现负载均衡
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
部署后nginx进程之间的关系,如下图所示:
那么为什么要按照master-worker方式配置多个进程:有两点
1.master进程可以是唯一的,只专注于管理真正提供服务的worker进程
2.多个worker进程提高了服务的健壮性,还充分利用现有的smp架构(堆成多处理架构),从而实现真正的多核并发处理
那么为什么worker进程设计的与cpu核数一致吶,先要看看apache与nginx有什么不同之处:
apache一个进程处理一个请求,在大并发量的情况下,只能加大进程或者线程数,通常一台服务器几百个进程,大量进程切换带来无谓的系统资源消耗
nginx一个worker进程可处理的请求数只限制在内存的大小,不同的worker进程处理并发请求没有同步锁限制,worker进程不会睡眠,故设置worker进程与cpu核数一致,进程间切换代价是最小的.(即cpu是8核,worker进程设置为8个.)(补充知识:进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将Worker进程数量设置超过核心数是没有太大意义的,会导致进程间切换额外开销)