簡體   English   中英

C:epoll和多線程

[英]C: epoll and multithreading

我需要創建專門的HTTP服務器,為此我計划使用epoll sycall,但我想利用多個處理器/核心,我無法提出架構解決方案。 ATM我的想法是跟隨:用自己的epoll描述符創建多個線程,主線程接受連接並在線程epoll之間分配它們。 但有更好的解決方案嗎? 我可以在高負載架構上閱讀哪些書籍/文章/指南? 我只看過C10K文章,但大多數鏈接到例子已經死了:(並且仍然沒有關於這個主題的深入書籍:(。

謝謝你的回答。

UPD:請更具體,我需要材料和示例(nginx不是一個例子,因為它太復雜,並且有多個抽象層來支持多個系統)。

我的想法是跟隨:用自己的epoll描述符創建多個線程,主線程接受連接並在線程epoll之間分配它們。

是的,這是目前最好的方法,它是Nginx如何做到的。 可以根據負載和/或機器上的物理核心數量來增加或減少線程數。

額外線程(超過物理內核數量)和事件之間的權衡是延遲和吞吐量之一。 線程可以提高延遲,因為它們可以先發制人地執行,但是由於上下文切換和線程創建/刪除引起的開銷而導致吞吐量損失。 事件提高了吞吐量,但缺點是長時間運行的代碼會導致整個線程停止。

第二個最好的是Apache2如何使用阻塞線程的線程池來完成它。 這里沒有事件處理,所以實現更簡單,池意味着線程不會被不必要地創建和銷毀,但它不能真正與你正在嘗試實現或Nginx實現的良好實現的線程/異步混合競爭。

第三個是單獨的異步事件處理,如Lighttpd或Node.js. 嗯,如果您沒有在服務器中進行繁重的處理,那么它是第二好的。 但如前所述,單個長時間運行的while循環會阻塞整個服務器。

檢查libeventlibev來源。 它們具有高可讀性,並且已經是一個很好的基礎設施。

另外,libev的文檔中有很多嘗試和真實策略的例子。 即使您更喜歡直接寫入epoll() ,這些示例也可以帶來一些見解。

除非您有太比特上行鏈路並且計划在單個服務器上同時為10000個連接提供服務,否則請忘記epoll 這只是無償的不可移植性; poll甚至select也一樣。 請記住,在太比特上行鏈路等標准時,您的服務器也將足夠快,您仍然不需要epoll

如果您只是提供靜態內容,請忘記線程並使用Linux sendfile系統調用。 這也是非標准的,但至少它提供了巨大的實際性能優勢。

另請注意,其他設計決策(尤其是過多的復雜性)將更多地影響服務器可以處理的負載量。 舉個例子,看看適度的單線程,單進程thttpd如何在靜態內容上吹噓Apache和朋友的表現 - 根據我的經驗,即使是傳統的cgi動態內容!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM