文章目录

  • (1)什么是惊群效应
  • (2)惊群问题(thundering herd)的产生
  • (3)惊群效应影响
  • (4)常见的惊群效应
    • A、accept 惊群
    • B、epoll惊群

引言: 随便写写

(1)什么是惊群效应

惊群问题又名惊群效应。简单来说就是多个进程或者线程在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒。唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现获取事件失败后又继续进入了等待状态,在一定程度上造成了资源浪费,降低了系统性能。

(2)惊群问题(thundering herd)的产生

在建立连接的时候,Nginx出于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会带来著名的“惊群”问题,子进程数量越多越明显,这会造成系统性能的下降。

一般情况下,有多少CPU核心就有配置多少个worker子进程。假设现在没有用户连入服务器,某一时刻恰好所有的子进程都休眠且等待新连接的系统调用(如epoll_wait),这时有一个用户向服务器发起了连接,内核在收到TCP的SYN包时,会激活所有的休眠worker子进程。最终只有最先开始执行accept的子进程可以成功建立新连接,而其他worker子进程都将accept失败。这些accept失败的子进程被内核唤醒是不必要的,他们被唤醒会的执行很可能是多余的,那么这一时刻他们占用了本不需要占用的资源,引发了不必要的进程切换,增加了系统开销。

(3)惊群效应影响

惊群效应会占用系统资源,降低系统性能。多进程/线程的唤醒,涉及到的一个问题是上下文切换问题。频繁的上下文切换带来的一个问题是数据将频繁的在寄存器与运行队列中流转。极端情况下,时间更多的消耗在进程/线程的调度上,而不是执行。

(4)常见的惊群效应

A、accept 惊群

以多进程为例,在主进程创建监听描述符listenfd后,fork()多个子进程,多个进程共享listenfd,accept是在每个子进程中,当一个新连接来的时候,会发生惊群。

在内核2.6之前,所有进程accept都会惊醒,但只有一个可以accept成功,其他返回EGAIN。

在内核2.6及之后,解决了惊群问题,办法是在内核中增加了一个互斥等待变量。一个互斥等待的行为与睡眠基本类似,主要的不同点在于:
a)当一个等待队列入口有 WQ_FLAG_EXCLUSEVE 标志置位, 它被添加到等待队列的尾部。若没有这个标志的入口项,则添加到队首。

b)当wake up被在一个等待队列上调用时,它在唤醒第一个有 WQ_FLAG_EXCLUSIVE 标志的进程后停止。
执行步骤:

/** The core wakeup function. Non-exclusive wakeups (nr_exclusive == 0) just* wake everything up. If it's an exclusive wakeup (nr_exclusive == small +ve* number) then we wake all the non-exclusive tasks and one exclusive task.** There are circumstances in which we can try to wake a task which has already* started to run but is not in state TASK_RUNNING. try_to_wake_up() returns* zero in this (rare) case, and we handle it by continuing to scan the queue.*/
static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,int nr_exclusive, int wake_flags, void *key)
{wait_queue_t *curr, *next;list_for_each_entry_safe(curr, next, &q->task_list, task_list) {unsigned flags = curr->flags;if (curr->func(curr, mode, wake_flags, key) &&(flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)break;}
}

对于互斥等待的行为,比如对一个 listen 后的socket描述符,多线程阻塞 accept 时,系统内核只会唤醒所有正在等待此时间的队列的第一个,队列中的其他人则继续等待下一次事件的发生。这样就避免的多个线程同时监听同一个socket描述符时的惊群问题。

B、epoll惊群

epoll惊群分两种:

a)是在fork之前创建 epollfd,所有进程共用一个epoll。

b)是在fork之后创建 epollfd,每个进程独用一个epoll。

a)fork之前创建epollfd(新版内核已解决)

主进程创建 listenfd,创建epollfd;

主进程 fork多个子进程;

每个子进程把listenfd,加到epollfd 中。

当一个连接进来时,会触发epoll惊群,多个子进程的epoll同时会触发。

这里的epoll惊群跟 accept 惊群是类似的,共享一个 epollfd,加锁或标记解决,在新版本的epoll中已解决,但在内核2.6及之前是存在的。

b)fork之后创建epollfd(内核未解决)

主进程创建 listendfd;

主进程创建多个子进程;

每个子进程创建自已的epollfd;

每个子进程把listenfd加入到epollfd中;

当一个连接进来时,会触发epoll 惊群,多个子进程epoll同时会触发。

因为每个子进程的epoll是不同的epoll, 虽然listenfd是同一个,但新连接过来时,accept会触发惊群。因为内核不知道该发给哪个监听进程,因为不是同一个epoll。所以这种惊群内核并没有处理,惊群还是会出现。

nginx中的惊群效应相关推荐

  1. 高并发中的惊群效应简介

    一.惊群效应简介 所谓惊群效应,就是多个进程或者线程在等待同一个事件,当事件发生时,所有进程或者线程都会被内核唤醒.然后,通常只有一个进程获得了该事件,并进行处理:其他进程在发现获取事件失败后,又继续 ...

  2. nginx如何解决惊群效应

    本文主要内容包括惊群效应简介.nginx如何解决惊群和一个仿照nginx避免惊群效应的简单例子 惊群效应 惊群简单来说就是多个进程或者线程在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒. ...

  3. Linux惊群效应之Nginx解决方案

    结论 不管还是多进程还是多线程,都存在惊群效应,本篇文章使用多进程分析. 在Linux2.6版本之后,已经解决了系统调用Accept的惊群效应(前提是没有使用select.poll.epoll等事件机 ...

  4. Nginx解决惊群效应

    1. 惊群效应 1.1 简介 惊群问题又名惊群效应.简单来说就是多个进程或者线程在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒.唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现 ...

  5. Nginx真的消除了惊群效应么?不

    想必看这边文章的人都了解什么是惊群效应以及在Nginx中惊群效应的解决方案,如果不了解,百度一下比比皆是. 接下来直入主题,nginx中的这套解决方案真的不会出现惊群效应么? 答案为否.我们看下具体情 ...

  6. Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++linux服务器开发

    Nginx源码实现的细枝末节 11个阶段的实现 视频讲解如下,点击观看: Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++li ...

  7. Linux环境,手把手带你实现一个Nginx模块,深入了解Nginx丨惊群效应|error|负载均衡|Openresty丨C/C++Linux服务器开发丨中间件

    Linux环境,手把手带你实现一个Nginx模块,深入了解Nginx 视频讲解如下,点击观看: Linux环境,手把手带你实现一个Nginx模块,深入了解Nginx丨惊群效应|error|负载均衡|O ...

  8. 系统通知并发问题_玩转Java高并发?请先说明下并发下的惊群效应

    实际项目中,我们有很多高并发的场景需要考虑.设计,在高并发领域有个很有特点的名词叫惊群效应,你了解吗? 一.啥是惊群效应 啥叫惊群效应,有个例子说明的很透彻.当你往一群鸽子中间扔一块食物,虽然最终只有 ...

  9. Linux惊群效应详解(最详细的了吧)

    https://blog.csdn.net/lyztyycode/article/details/78648798?locationNum=6&fps=1 linux惊群效应 详细的介绍什么是 ...

最新文章

  1. 洛谷模拟赛 部落冲突
  2. 微软日本每周只上四天班,销售额提升39.9%!网友:老板快来看啊
  3. iOS -数据库网络之xml解析之远程解析XML
  4. 第三阶段:2.产品运营:4.活动运营
  5. java 子类强转父类 父类强转子类
  6. LINUX 对引导加密
  7. 7-42 整型关键字的散列映射 (25 分)(思路加详解)兄弟们 来呀 写题呀
  8. 新冠患者样本单细胞测序文献汇总
  9. .md文件的打开与软件---markdown
  10. 用友NC6.5 6.33 6.3 5.7 5.5 5.02最新补丁下载
  11. navicat工具能安装在linux,linux下安装navicat
  12. 小花语音机器人(零)-单片机控制驱动板PCB
  13. 生活大爆炸第二季 那些精妙的台词翻译
  14. html,css,js 实现树形菜单栏
  15. 【跨域】 关于跨域的一些知识整合
  16. rs485接口上下拉_详解RS-485上下拉电阻的选择
  17. 数据挖掘课程第一章作业《认识数据挖掘与数据预处理》
  18. Excel文本处理函数
  19. 安装docker 配置 oracle11g
  20. 【嵌入式07】寄存器映射原理详解,GPIO端口的初始化设置步骤

热门文章

  1. 图片无损放大怎么做?这几种无损放大方法很简单
  2. VC++ 获取CPU的型号、主频和核数(附源码)
  3. vue中export和export default
  4. 挖一个深坑在那里找寻宝藏
  5. 【2022央视春晚】《这世界那么多人》 演唱:韩红,2022年不易
  6. 了解Android已发布的各种版本(即1.0、2.0、3.0、4.0、5.0、6.0、7.0、8.0)
  7. 同样是索尼IMX380 但夜间成像比华为P20更毒
  8. Git Learning 学习笔记
  9. 360家庭卫士显示无法连接服务器,360智能摄像机连接失败原因 360智能摄像机连接失败解决办法...
  10. 毕业论文开题报告 - 基于Linux的无线网络渗透测试研究