muduo (http://code.google.com/p/muduo) 是一個基於 Reactor 模式的 C++ 網絡庫,我在編寫它 的時候並沒有以高並發高吞吐為主要目標,但出乎我的意料,ping pong 測試表明,muduo 吞吐量比 boost.asio 高 15% 以上。
測試對象
boost 1.40 中的 asio 1.4.3
asio 1.4.5 (http://think-async.com/Asio/Download)
muduo 0.1.1 (http://muduo.googlecode.com/files/muduo-0.1.1-alpha.tar.gz) SHA1 Checksum: a446ea8a22915f439063d2bc52eb2dc4b9caf92d
測試環境
硬件:DELL 490 工作站,雙路 Intel quad core Xeon E5320 CPU,16G 內存
操作系統: Ubuntu Linux Server 10.04.1 LTS x86_64
編譯器:g++ 4.4.3
測試方法
依據 asio 性能測試 http://think-async.com/Asio/LinuxPerformanceImprovements 的辦法,用 ping pong 協議來測試吞吐量。
簡單地說,ping pong 協議是客戶端和服務器都實現 echo 協議。當 TCP 連接建立時,客戶端向服 務器發送一些數據,服務器會 echo 回這些數據,然後客戶端再 echo 回服務器。這些數據就會像乒乓 球一樣在客戶端和服務器之間來回傳送,直到有一方斷開連接為止。這是用來測試吞吐量的常用辦法。
asio 的測試代碼取自 http://asio.cvs.sourceforge.net/viewvc/asio/asio/src/tests/performance/ ,未作更改。
muduo 的測試代碼在 0.1.1 軟件包內,路徑為 examples/pingpong/,代碼如 http://gist.github.com/564985 所示。
muduo 和 asio 的優化編譯參數均為 -O2 -finline-limit=1000
$ BUILD_TYPE=release ./build.sh # 編譯 muduo 的優化版本
我主要做了兩項測試:
單線程測試,測試並發連接數為 1/10/100/1000/10000 時的吞吐量。
多線程測試,並發連接數為 100 或 1000,服務器和客戶端的線程數同時設為 1/2/3/4。(由於我 家裡只有一台 8 核機器,而且服務器和客戶端運行在同一台機器上,線程數大於 4 沒有意義。)
所有測試中,ping pong 消息的大小均為 16k bytes。測試用的 shell 腳本可從 http://gist.github.com/564985 下載。
測試結果
單線程測試的結果,數字越大越好:
多線程測試的結果,數字越大越好:
測試結果表明 muduo 吞吐量平均比 asio 高 15% 以上。
討論
muduo 出乎意料地比 asio 性能優越,我想主要得益於其簡單的設計和簡潔的代碼。
asio 在多線程測試中表現不佳,我猜測其主要原因是測試代碼只使用了一個 io_service,如果改用 “io_service per CPU”的話,性能應該有所提高。我對 asio 的了解程度僅限於能讀懂其代碼,希望 能有 asio 高手編寫“io_service per CPU”的 ping pong 測試,以便與 muduo 做一個公平的比較。
ping pong 測試很容易實現,歡迎其他網絡庫(ACE、POCO、libevent 等)也能加入到對比中 來,期待這些庫的高手出馬。
查看本欄目