1. 程式人生 > >myReactorServer: 基於事件驅動的C++高性能服務器

myReactorServer: 基於事件驅動的C++高性能服務器

字符 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++高性能服務器