Nginx惊群问题

Nginx惊群问题

“惊群”概念

所谓惊群,可以用一个简单的比喻来说明:
	一群等待食物的鸽子,当饲养员扔下一粒谷物时,所有鸽子都会去争抢,但只有少数的鸽子能够抢到食物,
大部分鸽子都是落空的,只能等待饲养员下一次的喂食。
	对于Nginx Web Server,就是多个进程都在等待
接受TCP连接请求,一旦TCP连接请求到来,只有一个或者少部分(多个TCP连接请求)进程能够获取连接成
功,而大部分进程在被操作系统唤醒后,获取连接失败,只能再次进入等待。

“惊群”处理

下面采用伪代码描述Nginx在Linux系统下对于“惊群”问题的处理

while (true) {
	if (multi-processes) {
		/*
		 *	尝试获取进程共享锁,不管是否成功,都立即返回。
		 *	如果获取成功,则通过epoll_ctl系统调用把连接等待fd添加到当前进程的epoll监听列表中;
		 *	如果获取失败,则通过epoll_ctl系统调用把连接等待fd从当前进程的epoll监听列表中移除。
		 */
		if (trylock(进程共享锁)) {
			falg |= 接受TCP连接请求;
		}

		//调整epoll超时等待时间
		//...
	}

	/*
	 *	epoll系统调用:
	 *	1.获取TCP连接请求fd,加入TCP连接请求队列;
	 *	2.获取TCP数据接收,发送请求fd,加入数据处理队列。
	 */	
	process_epoll_event();

	if (新的TCP连接请求) {
		对TCP连接等待fd多次执行接受TCP连接请求处理(accept or accept4);
	}

	if (进程共享锁) { 
		释放进程共享锁;
	}

	//处理数据接收,发送请求队列
	//...
}
posted @ 2015-08-05 14:20  WONDERFUL_cnblogs  阅读(225)  评论(0编辑  收藏  举报