myReactorServer: 基於事件驅動的C++高效能伺服器
阿新 • • 發佈:2018-12-12
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短連線
muduo短連線
myReactorServer長連線
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()等)