高效能伺服器 epoll驚群與lighttpd改良

2021-06-19 03:43:58 字數 988 閱讀 5280

關於高效能server,《unix網路程式設計》堪稱經典。根據說明,有如下三種相對高效的模型:

模型1(最強)

乙個程序中有預先建立多個執行緒都阻塞在accept函式(為了免accept驚群,可以在accept前先thread_lock),任何乙個監聽執行緒從accept返回得到乙個socket就自己處理這個socket.

模型2乙個程序中有預先建立多個執行緒都阻塞在select(事件分配)函式,select有返回就呼叫accept。《unix網路程式設計》指出select會出現驚群,所以慢了。

模型3預先建立多個執行緒,不過只有乙個執行緒阻塞在accept即只有乙個監聽執行緒,這個執行緒得到socket以後把這個socket給乙個空閒執行緒,用條件變數通知那個空閒程序。由於程序間通訊的成本,所以效率比第一種低。

然而模型1並不能充分提高吞吐率,原因是子執行緒的處理變成了同步io,一旦多使用者把預先分配的多執行緒全占用了,悲劇了。所以要利用事件分配機制。

關於事件分配機制(學名:反應器)

目前已知的linux反應器有select、poll、epoll。三者可以部分替換(可以參考lighttpd和nginx,都對反應器封裝了,還可以改執行配置來選擇不同機制)

既然同屬事件分配,神器epoll也應該有驚群問題,果然找到相關資料(

那怎麼辦?

1鴕鳥演算法:就用模型2(lighttpd就是)

2加鎖:模型2,事件分配前加thread__lock

lighttpd看來效率是低了(就算用epoll)

腫麼辦?

根據可以通過給子執行緒相同的eventpoll,而且如果公升級了核心(具體2.6.多少不清楚,但linux3.0+肯定可以),核心已經避免epoll驚群了。所以說,有以下兩條路

1公升級新linux核心(又方便又可靠)。

2理論可以事件分配前加lock(lighttpd是多程序哦,鎖成本高)

(話說為啥nginx還是比lighttpd高效,它可以用執行緒池,執行緒在記憶體共享方面有極大的優勢)

高效能伺服器之epoll

什麼是epoll epoll是什麼?是為處理 大批量控制代碼 而作了改進的poll。它 幾乎具備了之前所說的 一切優點,被公認為linux2.6下效能最好的多路i o就緒通 知 方法。epoll的相關系統調 用 epoll只有epoll create,epoll ctl,epoll wait 3個系...

高效能伺服器程式設計之epoll

在linux的網路程式設計中,經常使用多執行緒處理高併發的問題,然而linux系統對執行緒數量是有限制的,更重要的是執行緒的排程有系統開銷的,在客戶端數量龐大時,這將是無法接受的問題 另一種處理高併發的方法是使用select來做事件觸發,select實現中,它是採用輪詢來處理的,輪詢的fd數目越多,...

高效能伺服器設計

原文 http blog.chinaunix.net u 5251 showart 236329.html 先後檢視了 haproxy l7sw 和lighttpd 的相關原始碼,無一例外,他們一致認為多路復用是效能最好的伺服器架構 事實也確實應該如此,程序的出現一方面就是為了儲存任務的執行上下文從...