10万并发的高性能c++ webserver设计与实现

简介

       该项目使用c++11,参考muduo实现的静态web服务器。muduo网络库使用线程池+电平触发式epoll+NIO的Reactor模式实现。该项目汲取muduo的优点,并简化设计。采用线程池+边沿触发式epoll+NIO的Reactor模式实现,各个工作线程采用RR方式(Round Robin)来公平分配请求,同时引入了应用层心跳,来处理超时连接。该webserver支持长、短连接,采用被动式关闭,能优雅的断开连接。

       该项目参考muduo网络库Tcp骨架,针对Http协议处理过程设计而成。主要引入了HttpServer、HttpConnection和HttpHandler和HttpManager几个类,已应对接受Http请求、解析Http请求、应答Http请求以及管控Http连接的需要。

        采用压力测试工具webbench 1.5,实验得出:采用环回地址测试时,在10k长连接状态下,60s能处理1500w+个请求,响应能力为35 M/s。采用局域网地址测试时,在10k长连接状态下,60s能处理750w+个请求,响应能力为1.67 M/s。启动webserver时内存占用为1.8MB;10k长连接下,平均占用15MB内存。

        为方便测试,该项目也加入了简易的资源监控脚本、内存泄露检测脚本、一键启动webserver脚本,以及压力测试脚本。

目录结构

├── code
│   ├── Channel.cc
│   ├── config.h
│   ├── CountDownLatch.cc
│   ├── CurrentThread.h
│   ├── Epoll.cc
│   ├── Epoll.h
│   ├── EventLoop.cc
│   ├── EventLoopThread.cc
│   ├── EventLoopThreadPool.cc
│   ├── HttpConnection.cc
│   ├── HttpHandler.cc
│   ├── HttpHandler.h
│   ├── HttpManager.cc
│   ├── HttpServer.cc
│   ├── InetAddress.cc
│   ├── macros.h
│   ├── noncopyable.h
│   ├── Thread.cc
│   ├── ThreadPool.cc
│   ├── Timer.cc
│   ├── utils.cc
├── LICENSE
├── Makefile
├── memcheck.sh
├── monitor.sh
├── pic
├── README.md
├── run.sh
├── source
├── test
│   ├── client.cc
│   ├── EventLoopTest.cc
│   ├── EventLoopThreadPoolTest.cc
│   ├── EventLoopThreadTest.cc
│   ├── mainTest.cc
│   ├── ThreadPoolTest.cc
│   └── ThreadTest.cc
└── webbench
    ├── ChangeLog
    ├── COPYRIGHT
    ├── debian
    ├── Makefile
    ├── socket.c
    ├── tags
    ├── webbench
    ├── webbench.1
    ├── webbench.c
    └── webbench.sh

注:为简化排版,此处省略了.cc对应的.h文件。

代码统计

平台

        ubuntu 16.04 LTS

        gcc-5.4;g++5.4

        其他依赖:ctags

其他

       参阅github大神源码时,多采用Epoll边沿触发epollonespot模式。在该模式下,每个事件epoll仅被触发一次,其目的是防止多个线程处理相同的socket事件。但使用muduo的tcp骨架,自带线管化属性,每个Tcp连接绑定在某个事件循环上,仅能被所绑定的事件循环处理(不考虑负载迁移),所以并不需要开此选项。对于长连接的频繁的http请求,每次epollonespot都需要重新调用epoll_ctl,引入了额外的系统调用,且需要记住每个连接的在意的事件,以便在重新设置在意事件时,不会漏掉。

源码

github地址:GitHub - zavier-z/HttpServer: A webserver developed using modern c++

有关更多 C++ 技术分享,请关注 「码尘」

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值