myReactorServer: 基於事件驅動的C++高性能服務器
阿新 • • 發佈:2018-09-28
字符 mage 連接 服務 異步 form muduo nbsp 結果
myReactorServer: A High Performance C++ Web Server
項目地址
- myReactorServer
性能評估結果
身為一個Web Server,最重要的當然還是性能表現。所以不廢話,先上性能評估結果。
由於這個項目借鑒了muduo項目的架構,所以性能對比的對象主要就是muduo。
測試環境
- OS: Ubuntu 14.04
- 內存: 8G
- CPU: I7-4930K
評估工具
- WebBench
評估方法
評估結果
測試截圖放在後面。
| 服務器 | 短連接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()等)
myReactorServer: 基於事件驅動的C++高性能服務器