码迷,mamicode.com
首页 > 其他好文 > 详细

nginx惊群问题

时间:2015-06-01 16:25:47      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

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 (进程共享锁) { 
        释放进程共享锁;
    }

    //处理数据接收,发送请求队列
    //...
}

 

nginx惊群问题

标签:

原文地址:http://www.cnblogs.com/WONDERFUL-cnblogs/p/4544020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!