myReactorServer: 基于事件驱动的C++高性能服务器

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()等)
posted @ 2018-09-28 15:20  ChyauAng  阅读(1012)  评论(0编辑  收藏  举报