myReactorServer: A High Performance C++ Web Server

專案地址

效能評估結果

  身為一個Web Server,最重要的當然還是效能表現。所以不廢話,先上效能評估結果。   由於這個專案借鑑了muduo專案的架構,所以效能對比的物件主要就是muduo。

測試環境

  • OS: Ubuntu 14.04
  • 記憶體: 8G
  • CPU: I7-4930K

評估工具

評估方法

評估結果

  測試截圖放在後面。

| 伺服器 | 短連線QPS | 長連線QPS |
| myReactorServer | 66117 | 13802326 |
| muduo | 44529 | 1623832 |

評估結果截圖

myReactorServer短連線 myReactorServer短連線

muduo短連線 muduo短連線

myReactorServer長連線 myRaectorServer長連線

muduo長連線 muduo長連線

myReactorServer特性介紹

  • 事件驅動架構(one event loop per thread) + 執行緒池
  • master EventLoop執行緒 + I/O worker EventLoop執行緒 + 四緩衝非同步日誌執行緒。單程序多執行緒設計,提升併發性。發揮多核效能,降低延遲

  • 記憶體分配
    • 對資源使用預分配策略,進行池化處理,設計連線池(借鑑Nginx連線池設計),避免因頻繁記憶體分配、物件構造影響效能
  • 資料拷貝
    • Buffer的特別設計,借鑑Redis的SDS字串設計,使用Buffer chain,並對其使用scatter I/O,減少系統呼叫(read(), size(), realloc()等)次數
    • 使用C++ 11的移動語義,減少拷貝
    • 使用epoll LT,較selet與poll減少一次由使用者空間向核心空間的拷貝
  • 上下文切換
    • 分工明確的多執行緒設計 + EventLoop::runInLoop() + EventLoop::queueInLoop()避免執行緒上下文切換開銷
  • 鎖競爭
    • 通過邏輯與設計(master + workers + others執行緒)減少鎖的使用,且僅使用NPTL的互斥鎖mutex
    • 對於需要磁碟寫入的日誌執行緒,採取非同步形式,減少對計算及I/O執行緒的影響
    • 使用Copy-on-Write等手法儘可能的縮小臨界區(EventLoop::doPendingFunctors()等)