天天看點

linux驚群問題之udp

      今天測試udp伺服器程序時發現log中記錄了當程序收到一個請求後,會有多條失敗處理記錄,同時有一條成功處理記錄。伺服器程序使用sellect模式,通過fork四個子程序來監聽同一個socket。

      發現問題後初步懷疑是出現了驚群現象。但是,聽說現代核心已經解決了驚群問題,程式也可以确定也沒有問題,就奇怪問題發生在哪裡了。

      後來在網上一搜才知道,原來linux核心開發人員通過鎖機制解決了accept的驚群現象,但是對于sellect和epoll驚群問題并沒有解決,是以這種情形下驚群還會出現,也就是當多個程序通過sellect方式監聽同一個socket的可讀狀态時,當該socket變為可讀,所有的監聽程序都會被喚醒并進行處理,但是對于udp伺服器,其中第一個socket會一次性将資料讀完,導緻其他程序再讀socket都傳回了失敗。

     網友給的解釋是對于select,資料是不互斥的,也就是需要多個程序來讀取資源。

     是以,有使用fork+select搭建socket伺服器時要注意這個問題,很影響性能的。