Nginx惊群处理
惊群:是指在多线程/多进程中,当有一个客户端发生链接请求时,多线程/多进程都被唤醒,然后只仅仅有一个进程/线程处理成功,其他进程/线程还是回到睡眠状态,这种现象就是惊群。
惊群是经常发生现在server端,父进程fork很多子进程,当有客户端有链接请求时,所有子进程都被唤醒,可是只有一个子进程处理请求,其他子进程就继续休眠。
Nginx 处理集群的方法:
ngx_postd_events:是监听套接口上的事件
ngx_posted_accept_events:是新建连接事件(也就是监听套接口上发生的可读事件)
ngx_accept_mutex_held:看是否拥有锁
Nginx中统一时刻,监听套接口只可能被一个进程监控,并且在建立新连接时,通过获得锁,来确定那个子进程进行监控。当当前工作进程负载较小时,即当前活动连接数 < 最大可承受连接数的*7/8,就可以将监听套接口加入到自身的时间监控机制中,从而带来新的请求,如果当前进程的负载很大,则将该监听套接口从自身的事件中删除,避免带来的新的客户端的请求而带来更大的负载。
关于锁,持锁者必须缩短自身拥有锁的事件,所以Nginx是将很多时间延迟到释放锁之后进行处理,把锁释放,尽量释放拥有锁的时间,让其他进程有机会获得锁。
if (ngx_use_accept_mutex)
{
//
当前的连接数是否超过最大可承受连接数的 /
if (ngx_accept_disabled > )
{
ngx_accept_disabled--;
}
else
{
//获得锁
if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR)
{
return;
}
//获得锁,表明新建连接后,将所有事件延后处理,先释放锁,是的拥有锁的事件最小化
if (ngx_accept_mutex_held)
{
flags |= NGX_POST_EVENTS;
}
else
{
//没有获得锁传给epoll_wait使得epoll_wait 使得返回时间剪短防止长时间连接没有返 //回
if (timer == NGX_TIMER_INFINITE|| timer > ngx_accept_mutex_delay)
{
timer = ngx_accept_mutex_delay;
}
}
} ngx_accept_disabled = ngx_cycle->connection_n /
- ngx_cycle->free_connection_n; delta = ngx_current_msec; (void) ngx_process_events(cycle, timer, flags); delta = ngx_current_msec - delta; ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, ,
"timer delta: %M", delta); //新建链接缓存
ngx_event_process_posted(cycle, &ngx_posted_accept_events); //释放锁
if (ngx_accept_mutex_held) {
ngx_shmtx_unlock(&ngx_accept_mutex);
} if (delta) {
ngx_event_expire_timers();
}
ngx_event_process_posted(cycle, &ngx_posted_events);
/*
此处释放锁并没有将监听套接字从时间监控机制中删除,在接下来的ngx_posted_events缓存事件时,互斥锁被另一个进程争取,并且把监听套接字加入到事件监听机制中,而同一时间,一个监听套接字被多个程序占有,因此进程在处理完ngx_posted_events后去争取锁,发现锁被其他进程占用而失败,所以将该监听套接口从自身的事件监听机制中删除,然后才进行事件监控。
*/
Nginx惊群处理的更多相关文章
- Nginx惊群问题
Nginx惊群问题 "惊群"概念 所谓惊群,可以用一个简单的比喻来说明: 一群等待食物的鸽子,当饲养员扔下一粒谷物时,所有鸽子都会去争抢,但只有少数的鸽子能够抢到食物, 大部分鸽子 ...
- NGINX怎样处理惊群的
写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...
- “惊群”,看看nginx是怎么解决它的
在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群.可以想见,效率很 ...
- Nginx学习之一-惊群现象
惊群问题(thundering herd)的产生 在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连 ...
- 【转载】“惊群”,看看nginx是怎么解决它的
原文:http://blog.csdn.net/russell_tao/article/details/7204260 在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下 ...
- Nginx中的惊群现象解决方法
*什么是惊群现象?Nginx中用了什么方法来避免这种问题的发生?本篇就解决这两个问题...→_→* 惊群现象的定义与危害 在Nginx中,每一个worker进程都是由master进程fork出来的.m ...
- 【Nginx】惊群问题
转自:江南烟雨 惊群问题的产生 在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会 ...
- Nginx模型 & 惊群问题
这篇写的不错 http://www.cnblogs.com/linguoguo/p/5511293.html Nginx为啥性能高-多进程异步IO模型 1. 对于每个worker进程来说,独立的进程, ...
- nginx&http 第三章 惊群
惊群:概念就不解释了. 直接说正题:惊群问题一般出现在那些web服务器上,Linux系统有个经典的accept惊群问题,这个问题现在已经在内核曾经得以解决,具体来讲就是当有新的连接进入到accept队 ...
随机推荐
- BZOJ1009:[HNOI2008]GT考试——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1009 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0&l ...
- POJ. 2253 Frogger (Dijkstra )
POJ. 2253 Frogger (Dijkstra ) 题意分析 首先给出n个点的坐标,其中第一个点的坐标为青蛙1的坐标,第二个点的坐标为青蛙2的坐标.给出的n个点,两两双向互通,求出由1到2可行 ...
- ACE_Message_Block功能简介
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607960.html ACE_Message_Block在Ace中用来表示消息的存放空间 ...
- Human life FZU - 2295 最大权闭合子图(第一次遇到被教育了)
Xzz is playing a MMORPG "human life". In this game, there are N different skills. Some ski ...
- eclipse的最新版本luna的中建立svn和maven
http://blog.csdn.net/notillusion/article/details/40950185
- acm1878欧拉回路
欧拉回路解释 对于本题我们只要把每个点的度进行记录,判断是否存在奇数度的点,如果是就可以判断不是欧拉回路,如果不是就在一个点出发,进行dfs搜索, 看能否走到起点,因为对于欧拉回路是一个闭合的回路,无 ...
- WPF 与设备无关的单位
WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile PC的屏幕上和在50英寸的电视机上都 ...
- LightOJ 1218 概率水题(几何分布)
题意:给你一个n面骰子,问你投出所有面需要的次数的期望值是多少. 题解:放在过去估计秒解,结果现在自己想好久,还查了下,有人用极限证明...实际上仔细想想这种情况投出与前面不一样的概率p的倒数就是次数 ...
- 使用Docker搭建Django,Nginx,R,Python部署环境
转载自https://blog.csdn.net/The_One_is_all/article/details/76063968 基本环境: Ubuntu 16.10 docker 17.06.0-c ...
- 函数式编程--响应式编程 ---android应用例子
RxJava implements this operator as create. It is good practice to check the observer’s isUnsubscribe ...