WebServer详解

使用C++语言,编写了一个基于Linux的HttpServer,能够实现上万的QPS。

项目地址:

功能

  • 利用I/O多路复用技术的Epoll线程池实现【单Reactor、多线程】的高并发服务器模型;
  • 利用有限状态机和正则解析HTTP请求报文;
  • 利用STL标准库容器封装char,实现自定义的缓冲区;
  • 基于堆结构实现的定时器,关闭超时的非活跃网络连接;
  • 支持GET请求

项目详解

WebServer项目——webserver详解
WebServer项目——threadpool详解
WebServer项目——buffer详解
WebServer项目——epoller详解
WebServer项目——httpconnect详解
WebServer项目——timer详解

环境要求
  • Linux
  • C++11
项目启动

拷贝整个项目文件,在终端中使用

// 编译可执行文件
sudo ./autobuild.sh
// 启动服务器程序
./bin/myserver 9999
性能表现

压力测试

./webbench-1.5/webbench -c 10 -t 10 http://ip:port/
./webbench-1.5/webbench -c 100 -t 10 http://ip:port/
./webbench-1.5/webbench -c 1000 -t 10 http://ip:port/
./webbench-1.5/webbench -c 10000 -t 10 http://ip:port/
  • 测试环境:Ubuntu18, CPU i7-9700 3.00GHz, 内存 16GB

QPS对比
用我自己的测试环境跑了一下【markparticle】和【老猫轩仔】的web服务器,并将测试情况记录如下表

10100100010000
markparticle892991269209155
老猫轩仔122431196711926132
本项目76668648912811220
  • 20000个客户端10s的高并发访问下,QPS一度达到12210。
  • 老猫轩仔的服务器在压力测试过程中会出现无法访问的情况。
  • markparticle的服务器配置了MySQL,操作上有所不同,暂时没有使用自己的机器进行测试。

【老猫轩仔】的服务器和我有两点主要的不同:异步读写和定时器管理。就上述的测试结果来看,我猜测在客户端数量较少的时候,使用定时器能够提高服务器的QPS,但是当客户端数量上万之后,频繁的管理定时器,拖累了服务器的响应速度。QPS在上万客户端访问时,降到了百分之一。

致谢

@老猫轩仔

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐