zoukankan      html  css  js  c++  java
  • 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 (进程共享锁) { 
    		释放进程共享锁;
    	}
    
    	//处理数据接收,发送请求队列
    	//...
    }
  • 相关阅读:
    在Linux终端命令行下播放音乐的命令
    危险,几条可致命的Linux命令!
    Linux 之 shell 比较运算符
    Linux-dd命令详解
    vi总结的几个技巧
    用iptables实现代理上网
    CentOS7.5 开启Samba服务
    CentOS7.5常用命令
    CentOS7.5 安装部署Apache+Mysql+Php
    C++入门基础笔记
  • 原文地址:https://www.cnblogs.com/WONDERFUL-cnblogs/p/4704606.html
Copyright © 2011-2022 走看看