2013-03-20 111 views
4

我正在設計一個高性能服務器(而不是HTTP服務器),並且正在考慮我的設計選項。服務器應支持大量的傳入連接(以千計),並在Windows和Linux上進行編譯。使用libEvent的高性能服務器

在窗口方面,我已經實現了一個IO完成端口服務器,這個服務器目前似乎可以處理壓力。由於linux需求彈出,我現在嘗試找到一個跨平臺的庫,它使我能夠在線程池中使用接受/讀取事件。

到目前爲止,libEvent似乎是正確的選擇(類似於link中的「示例代碼:回顯服務器」)。但是從another page in the libEvent docs報價:

如果event_base被設置爲使用鎖,它是安全的多線程之間訪問 。但是,它的循環只能在單個線程中運行,但是,該循環只能在 之間運行。如果你想有多個線程輪詢IO,你需要 爲每個線程都有一個event_base。

我的基本設計是讓線程池響應接受和讀取事件。這句話,如果我理解正確,說我不能那樣做。

有沒有人有任何高perf的經驗。基於libEvent的服務器?我應該使用不同的圖書館嗎?

這種服務器的示例代碼將是完美的

回答

6

libevent是去,如果你想保持跨平臺的方式。

如果你想成爲高效的,我會推薦平臺特定的API像IO完成端口的Linux操作系統(這已在Windows工作)和epoll

注意的libevent使用epoll的內部對Linux的反正。

至於你的多線程設計問題,我希望你沒有使用一個線程來處理每個傳入的客戶端連接......如果你使用了事件驅動模型,你將會失敗!您應該設計代碼,以便一個線程處理少數客戶端連接,並且在併發連接數增加時增加線程數。

我也不會對客戶端在接收數據的IO線程池中發送的數據執行任何繁重的計算工作。我將把網絡密集型IO的任務分開,並將任何CPU密集型計算分成兩個獨立的線程池