你寫(xiě)的關(guān)于epoll驚群的問(wèn)題有些不妥
1. Linux 4.9之后已經(jīng)部分修復(fù)了epoll的驚群?jiǎn)栴},在epoll_ctl時(shí)候同時(shí)設(shè)置EXCLUSIVE標(biāo)志,內(nèi)核就會(huì)在事件發(fā)生的時(shí)候只喚醒一個(gè)進(jìn)程或線(xiàn)程,如果設(shè)置ET模式,這時(shí)候是不會(huì)存在驚群?jiǎn)栴}的。
2.之所以說(shuō)Linux4.9部分解決這個(gè)問(wèn)題,是因?yàn)長(zhǎng)T模式導(dǎo)致的,因?yàn)樵贚T模式下,如果有時(shí)間發(fā)生,內(nèi)核會(huì)喚醒進(jìn)程去處理,然而如果這個(gè)處理進(jìn)程并沒(méi)有立即處理這個(gè)事件,那么內(nèi)核會(huì)喚起其他進(jìn)程處理這個(gè)事件,這時(shí)候就導(dǎo)致了驚群。原因是因?yàn)長(zhǎng)T模式下內(nèi)核不會(huì)立即將事件從rdlist中取出,而是在其處理完之后再移除rdlist。
你的代碼如果要發(fā)生驚群的話(huà)應(yīng)該把sleep(2)打開(kāi),然后用默認(rèn)的LT模式。
關(guān)于linux中select和epoll是否存在驚群效應(yīng)的爭(zhēng)執(zhí)親測(cè),先給出結(jié)論:select不存在驚群效應(yīng),每次來(lái)一個(gè)socket消息,只有一個(gè)消費(fèi)進(jìn)程被喚醒。e_poll存在驚群效應(yīng),每次來(lái)一個(gè)socket連接請(qǐng)求,處于空閑狀態(tài)的消費(fèi)...