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短连接

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

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

时间: 2024-11-02 23:24:57

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

epoll高并发多路复用,基于epoll的高性能服务器

并发测试工具ab使用 linux命令安装这个工具:apt-get install apache2 windows中装好apache之后就会再带一个工具 windows命令使用方法 ab -n 200 -c 5 http://www.baidu.com/ 1000就是测试的数量 -c 10 就是开启的线程数 测试的地址 反回了一些测试信息,如 使用时间,每次要多久等信息. linux也是一样用的. epoll多路复用IO 高并发 epoll多路复用是专门用来处理高并发的,在linux多路复用中有多

基于JDK7 NIO2的高性能web服务器实践之二(转)

前一篇博客,我简单提了下怎么为NIO2增加TransmitFile支持,文件传送吞吐量是一个性能关注点,此外,并发连接数也是重要的关注点. 不过JDK7中又一次做了简单的实现,不支持同时投递多个AcceptEx请求,只支持一次一个,返回后再投递.这样,客户端连接的接受速度必然大打折扣.不知道为什么sun会做这样的实现,WSASend()/WSAReceive()一次只允许一个还是可以理解,毕竟简化了编程,不用考虑封包乱序问题.也降低了内存耗尽的风险.AcceptEx却没有这样的理由了. 于是再一

【高性能服务器】Nginx剖析

引言 Nginx是一个流行的高性能服务器,官方宣称在压力测试下可以支持5万个并发连接,而且占用内存极低.相比于其他昂贵的硬件负载均衡解决方案,Nginx是开源免费的,可以大大降低成本.本文将从一下几个方面来剖析其内部结构. 特点 进程模型 惊群效应 负载均衡 核心模块 模块分类 事件驱动模块机制 反向代理模块 配置文件 Nginx的特点 Nginx是俄罗斯工程师开发的高性能Web服务器,为了实现高效Nginx全部采用C语言编写,因为底层对不同的操作系统进行了封装,所以Nginx实现了平台无关性.

【转】高性能服务器架构(High-Performance Server Architecture)

High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:http://www.lupaworld.com/home/space-341888-do-blog-id-136718.html (map注:本人看了一遍,“于我心有戚戚焉”,翻译得也很好,于是整理了一下,重新发布,备忘) 引言 本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说的服务器,更

高性能服务器架构(High-Performance Server Architecture)

High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html 译文来源:http://www.lupaworld.com/home/space-341888-do-blog-id-136718.html (map注:本人看了一遍,"于我心有戚戚焉",翻译得也很好,于是整理了一下,重新发布,备忘) 引言 本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说

Linux高性能服务器编程——定时器

 定时器 服务器程序通常管理着众多定时事件,因此有效组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响.位置我们要将每个定时事件封装成定时器,并使用某种容器类型的数据结构,比如链表.排序链表和时间轮将所有定时器串联起来,以实现对定时事件的统一管理. Linux提供三种定时方法: 1.socket选项SO_RECVTIMEO和SO_SNDTIMEO. 2.SIGALRM信号 3.I/O复用系统调用的超时参数 socket选项SO_RCVTI

完成端口与高性能服务器程序开发

原文出处:http://blog.csdn.NET/roen/archive/2007/03/19/1533378.aspx 以一个文件传输服务端为例,在我的机器上它只起两个线程就可以为很多个客户端同时提供文件下载服务,程序的性能会随机器内CPU个数的增加而线性增长,我 尽可能做到使它清晰易懂,虽然程序很小却用到了NT 5的一些新特性,重叠IO,完成端口以及线程池,基于这种模型的服务端程序应该是NT系统上性能最好的了. 首先.做为完成端口的基础,我们应该理解重叠IO,这需要你已经理解了内核对象及

创业笔记-Node.js入门之基于事件驱动的回调

基于事件驱动的回调 这个问题可不好回答(至少对我来说),不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因. 你也许会想花点时间读一下Felix Geisendörfer的大作Understanding node.js,它介绍了一些背景知识. 这一切都归结于“Node.js是事件驱动的”这一事实.好吧,其实我也不是特别确切的了解这句话的意思.不过我会试着解释,为什么它对我们用Node.js写网络应用(Web based application)是有意义的. 当我们使

Python:使用基于事件驱动的SAX解析XML

SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 您可能已经知道语法分析器有两类接口 - 基于对象的(如:DOM)和基于事件(如:SAX)的接口. DOM是基于对象的语法分析器的标准 API. 作为基于对象的接口,DOM 通过在内存中显示地构建对象树来与应用程序通信.对象树是 XML 文件中元素树的精确映射. DOM 易于学习和使用,因为它与基本