问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

“惊群”,看看nginx是怎么解决它的 / 蓝讯

发布网友 发布时间:2022-05-01 07:05

我来回答

1个回答

热心网友 时间:2022-06-25 21:08

在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群。可以想见,效率很低下,许多进程被内核重新调度唤醒,同时去响应这一个事件,当然只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠(也有其他选择)。这种性能浪费现象就是惊群。

惊群通常发生在server 上,当父进程绑定一个端口监听socket,然后fork出多个子进程,子进程们开始循环处理(比如accept)这个socket。每当用户发起一个TCP连接时,多个子进程同时被唤醒,然后其中一个子进程accept新连接成功,余者皆失败,重新休眠。

那么,我们不能只用一个进程去accept新连接么?然后通过消息队列等同步方式使其他子进程处理这些新建的连接,这样惊群不就避免了?没错,惊群是避免了,但是效率低下,因为这个进程只能用来accept连接。对多核机器来说,仅有一个进程去accept,这也是程序员在自己创造accept瓶颈。所以,我仍然坚持需要多进程处理accept事件。

其实,在linux2.6内核上,accept系统调用已经不存在惊群了(至少我在2.6.18内核版本上已经不存在)。大家可以写个简单的程序试下,在父进程中bind,listen,然后fork出子进程,所有的子进程都accept这个监听句柄。这样,当新连接过来时,大家会发现,仅有一个子进程返回新建的连接,其他子进程继续休眠在accept调用上,没有被唤醒。

但是很不幸,通常我们的程序没那么简单,不会愿意阻塞在accept调用上,我们还有许多其他网络读写事件要处理,linux下我们爱用epoll解决非阻塞socket。所以,即使accept调用没有惊群了,我们也还得处理惊群这事,因为epoll有这问题。上面说的测试程序,如果我们在子进程内不是阻塞调用accept,而是用epoll_wait,就会发现,新连接过来时,多个子进程都会在epoll_wait后被唤醒!

nginx就是这样,master进程监听端口号(例如80),所有的nginx worker进程开始用epoll_wait来处理新事件(linux下),如果不加任何保护,一个新连接来临时,会有多个worker进程在epoll_wait后被唤醒,然后发现自己accept失败。现在,我们可以看看nginx是怎么处理这个惊群问题了。

nginx的每个worker进程在函数ngx_process_events_and_timers中处理事件,(void) ngx_process_events(cycle, timer, flags);封装了不同的事件处理机制,在linux上默认就封装了epoll_wait调用。我们来看看ngx_process_events_and_timers为解决惊群做了什么:

[cpp] view plain copy

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
儿歌祖国妈妈我爱你是谁写的汇总28句 为什么有的人学几何很厉害数学却不行 一个人数学几何好,但是其他计算方面的都马马虎虎,那么说明这个人怎么... 数学几何好的人,就是一道几何题很快就能想出来的人是不很聪明?这能练... 固安尚城国际怎么样 驾驶员咨询服务营业执照经营范围怎么写 驾校属于什么经营范围 核桃粉保质期多长时间 亿生康宝筋骨冷敷凝胶只在国内销售吗? 清河镇概况 Centos7安装nginx完成后发现nginx.conf文件中没有server,只有events{...} 和http{...},这是什么问题? nginx安装完后发现nginx.conf文件中没有server,只有events{...} 和http{...},这是什么问题? CentOS无法启动的时候该怎么进入救援模式 救援模式下找不到linux文件系统 Linux的救援模式下,vi不正常。 司法拍卖房要注意什么呢? mysqldump导出数据库的时候是不是锁库的 主板技嘉b150m-d3v-cf可以装什么风扇 迈腾的acc是什么意思 谁能告诉我P站是什么?是像B站一样的app吗?最好能帮忙详细解释一下 ACC是什么系统?好多朋友都说ACC好用的很,我有点尴尬不太清楚这个东西,所以来问问万能的网友。 为什么管b站叫p站?? acc指的是什么? 什么是ACC系统? 我想大量批发a4打印纸,请问什么地方有批发市场 山粉皮怎么做 有哪位大虾知道A4打印纸直接从造纸厂批发的价格。急!急!急! 粉皮烧什么好吃? - 信息提示 腰5\骶1椎间盘突出(右侧边缘型,神经根受压移位)2、腰椎椎体骨质轻度增生。怎么治疗请求专业帮助 三个月如何备考教编呢? 我想要买篮球架,去哪里买好啊?谁给点参考资料瞧瞧,谢谢! 教师编该如何备考? 教师招聘考试应该怎么复习 教师招聘考试如何做好备考计划? 教师招聘考试应该如何备考呢? ·教师招聘教综怎么备考? 怎么备考教师招聘 怎么样去备考教师招聘考试? 谁有表达相思的古文,诗歌。最好事小诗。(爱情) 请问outlook 2013 中如何让右下角显示往来邮件? 怎样设置outlook里的邮件显示 outlook右下角显示一直有邮件发送中求解决办法 如何让outlook在新邮件到达时在电脑右下方跳出提示? 怎么设置outlook桌面显示未阅读邮件,就是在右下角出现一个邮件的logo,我点了不要显示就再也显示不出来了 microsoft outlook 邮件怎么样显示收件内容 如何让outlook点击邮件显示内容 mac outlook 阅读窗格选择"右",邮件列表展示空白,邮件内容可以看到,如下图,求指教!!!! outlook新邮件来时,在桌面右下角提示的图标因不活动被其他图标掩盖了,怎么让邮件提示图标一直显示? outlook2007阅读窗格中点击一个邮件,在右边窗格只能看到邮件的正文,不能看到发件人的详细信息?