[英]C: epoll and multithreading
我需要創建專門的HTTP服務器,為此我計划使用epoll sycall,但我想利用多個處理器/核心,我無法提出架構解決方案。 ATM我的想法是跟隨:用自己的epoll描述符創建多個線程,主線程接受連接並在線程epoll之間分配它們。 但有更好的解決方案嗎? 我可以在高負載架構上閱讀哪些書籍/文章/指南? 我只看過C10K文章,但大多數鏈接到例子已經死了:(並且仍然沒有關於這個主題的深入書籍:(。
謝謝你的回答。
UPD:請更具體,我需要材料和示例(nginx不是一個例子,因為它太復雜,並且有多個抽象層來支持多個系統)。
我的想法是跟隨:用自己的epoll描述符創建多個線程,主線程接受連接並在線程epoll之間分配它們。
是的,這是目前最好的方法,它是Nginx如何做到的。 可以根據負載和/或機器上的物理核心數量來增加或減少線程數。
額外線程(超過物理內核數量)和事件之間的權衡是延遲和吞吐量之一。 線程可以提高延遲,因為它們可以先發制人地執行,但是由於上下文切換和線程創建/刪除引起的開銷而導致吞吐量損失。 事件提高了吞吐量,但缺點是長時間運行的代碼會導致整個線程停止。
第二個最好的是Apache2如何使用阻塞線程的線程池來完成它。 這里沒有事件處理,所以實現更簡單,池意味着線程不會被不必要地創建和銷毀,但它不能真正與你正在嘗試實現或Nginx實現的良好實現的線程/異步混合競爭。
第三個是單獨的異步事件處理,如Lighttpd或Node.js. 嗯,如果您沒有在服務器中進行繁重的處理,那么它是第二好的。 但如前所述,單個長時間運行的while循環會阻塞整個服務器。
除非您有太比特上行鏈路並且計划在單個服務器上同時為10000個連接提供服務,否則請忘記epoll
。 這只是無償的不可移植性; poll
甚至select
也一樣。 請記住,在太比特上行鏈路等標准時,您的服務器也將足夠快,您仍然不需要epoll
。
如果您只是提供靜態內容,請忘記線程並使用Linux sendfile
系統調用。 這也是非標准的,但至少它提供了巨大的實際性能優勢。
另請注意,其他設計決策(尤其是過多的復雜性)將更多地影響服務器可以處理的負載量。 舉個例子,看看適度的單線程,單進程thttpd
如何在靜態內容上吹噓Apache和朋友的表現 - 根據我的經驗,即使是傳統的cgi動態內容!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.