码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-09-28 16:27:20      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:size   长连接   worker   queue   内存   ++   频繁   对比   构造   

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()等)

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

标签:size   长连接   worker   queue   内存   ++   频繁   对比   构造   

原文地址:https://www.cnblogs.com/ChyauAng/p/9717507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!