快捷搜索: 王者荣耀 脱发

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地址:

经验分享 程序员 微信小程序 职场和发展