简介
该项目使用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,引入了额外的系统调用,且需要记住每个连接的在意的事件,以便在重新设置在意事件时,不会漏掉。
源码
来源:CSDN
作者:Michealzn
链接:https://blog.csdn.net/m0_38076911/article/details/103654528