惊群:是指在多线程/多进程中,当有一个客户端发生链接请求时,多线程/多进程都被唤醒,然后只仅仅有一个进程/线程处理成功,其他进程/线程还是回到睡眠状态,这种现象就是惊群。

惊群是经常发生现在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惊群处理的更多相关文章

  1. Nginx惊群问题

    Nginx惊群问题 "惊群"概念 所谓惊群,可以用一个简单的比喻来说明: 一群等待食物的鸽子,当饲养员扔下一粒谷物时,所有鸽子都会去争抢,但只有少数的鸽子能够抢到食物, 大部分鸽子 ...

  2. NGINX怎样处理惊群的

    写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...

  3. “惊群”,看看nginx是怎么解决它的

    在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群.可以想见,效率很 ...

  4. Nginx学习之一-惊群现象

    惊群问题(thundering herd)的产生 在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连 ...

  5. 【转载】“惊群”,看看nginx是怎么解决它的

    原文:http://blog.csdn.net/russell_tao/article/details/7204260 在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下 ...

  6. Nginx中的惊群现象解决方法

    *什么是惊群现象?Nginx中用了什么方法来避免这种问题的发生?本篇就解决这两个问题...→_→* 惊群现象的定义与危害 在Nginx中,每一个worker进程都是由master进程fork出来的.m ...

  7. 【Nginx】惊群问题

    转自:江南烟雨 惊群问题的产生 在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会 ...

  8. Nginx模型 & 惊群问题

    这篇写的不错 http://www.cnblogs.com/linguoguo/p/5511293.html Nginx为啥性能高-多进程异步IO模型 1. 对于每个worker进程来说,独立的进程, ...

  9. nginx&http 第三章 惊群

    惊群:概念就不解释了. 直接说正题:惊群问题一般出现在那些web服务器上,Linux系统有个经典的accept惊群问题,这个问题现在已经在内核曾经得以解决,具体来讲就是当有新的连接进入到accept队 ...

随机推荐

  1. foo.prototype作为新对象的原型来使用

    最近在研究js,疑惑也比较多.主要是被原型这个东西给弄迷糊了.疑惑出自于: function foo { this.name = 'foo'; } alert(foo.prototype === Fu ...

  2. android 自定义控件---圆形方向盘

    在做Android平台开发的时候,经常会遇到安卓原生控件无法满足需求的情况,安卓允许开发者去继承已经存在的控件或者实现你自己的控件. 先来看一下效果图 采用直接集成View类,重写onDrow方法绘制 ...

  3. springboot集成junit测试与javamail测试遇到的问题

    1.springboot如何集成junit测试? 导入junit的jar包 使用下面注解: @RunWith()关于这个的解释看下这两篇文章: http://www.imooc.com/qadetai ...

  4. scrapy架构设计分析

    scrapy是一个Python爬虫框架.我们自己用requests也能写爬虫(GET某个URL,然后Parse网页的内容),那么,问题来了,scrapy高明在哪些地方呢?下面就来讨论下这个话题,看看业 ...

  5. How to solve “Device eth0 does not seem to be present, delaying initialization” error

    Today, I encountered with a strange error after I cloned CentOS 6 guest machine in Oracle VirtualBox ...

  6. 线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

    不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程.对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦 ...

  7. poj 2541 Binary Witch

    Binary Witch http://poj.org/problem?id=2541 Time Limit: 1000MS   Memory Limit: 65536K       Descript ...

  8. 51Nod 1080

    #include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3 ...

  9. 【C++ STL】Deques

    1.结构 容器deque和vector非常相似,也是采用动态数组来管理元素,提供随机存取,有着和vector几乎一样的接口,不同的是deque的动态数组头尾都开放,因此可以在头尾都可以进行快速的安插和 ...

  10. Enterprise Architect 13 : 将绘制的图形导出成图片 或者 拷贝到剪贴板中

    使用Enterprise Architect 13 工具画类图.包图.需求图.状态图.时序图什么的导出成图片格式 或者拷贝到剪贴版,步骤如下: Publish -> Save Image -&g ...