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