本项目是由C++11编写的一个静态web服务器,能够解析GET请求,参考了陈硕大佬的muduo网络库,linya的WebServer和游双的《Linux高性能服务器编程》。支持http长连接,并且实现了异步日志。在本机上使用webbench并发 1000个clients访问, 短连接能达到大概3wQPS 长连接能达到大概7wQPS。
mkdir build
cd build
cmake ..
make
- 本项目使用的并发模型是Reactor+非阻塞io复用+线程池,设计基本遵循muduo中所说的one loop per thread。 一个mainloop负责接受连接,然后将连接交给线程池中的loopthread处理,loopthread全权负责接受到的连接,即同时负责接受数据,对数据进行处理和发送数据。
- 项目使用基于对象的设计,而非面向对象的设计,大量使用std::bind来代替虚函数。
- 项目使用的是epoll的ET触发模式,因为一个连接的数据始终只由接管它的io线程负责,所以没有设置EPOLLONESHOT,如果要新增线程池用于计算数据的话,考虑到数据争议的问题需要添加EPOLLONESHOT
- 服务器需要定时关闭长时间不活跃的连接,对此本项目使用一个timerfd加一个最小堆实现的。timerfd定时被唤醒,eventloop会处理其handleRead(),handleRead()会去除堆中已经disable并执行那些未disable且超时的timer,直到堆为空或下一个timer是active且未超时的。