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

自古美人都是妖i 提交于 2019-12-23 02:16:51

简介

       该项目使用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地址:https://github.com/MichealZwen/HttpServer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!