Skip to content

LhdDream/my_web

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 

Repository files navigation

A C++ High Performance Web Server

本项目是运行在Linux平台上的Web服务器,它由C++17编写,目前支持处理HTTP/1.1的静态GET请求以及FastCGI请求,支持HTTP长连接.

Part Ⅰ Part Ⅱ Part Ⅲ Part Ⅳ
并发模型 项目历史 项目目的 自我反思

特性:

  • Reactor风格
  • 基于事件驱动模型
  • C++设计模式中的享元模式
  • 提供简单日志类作为调试工具
  • 基于状态机的HTTP协议解析器
  • 使用自己构建的最小堆关闭超时连接
  • Linux Kernel 2.6+新特性(ReusePort)
  • 为减少内存泄漏的可能,使用智能指针等RAII机制
  • 使用多线程,epoll边沿触发的多路复用技术,非阻塞IO
  • C++部分特性(thread_local , std::string_view...)
  • 配置简单.使用JSON格式单配置文件,通过rapidjson 来进行解析,拥有初始配置文档,不需要修改大量配置文件.
  • ...

性能

测试环境

  • CPU: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
  • 内存: 12GiB
  • 网卡: RealTek RTL-8169 Gigabit Ethernet driver 1000M
  • 磁盘: TOSHIBA MQ01ABF050(5400转/秒)
  • 操作系统: Manjaro Linux

测试工具

  • 使用工具: ab2.3Webbench1.5

  • Nginx配置:

  worker_processes : 4 ( 和my_web线程数量相同 )
  listen 6060 reuseport ;(开启reuseport选项)
  tcp_nodelay on;
  sendfile on;
  work_connections : 65535;
  

Ab2.3

单客户端测试

测试命令:

ab -n 500000 -c 1 http:127.0.0.1:<端口号>/

完成时间(越少越好):

image

每秒完成请求数(越多越好):

image

每个请求花费的时间(越少越好):

image

百分比请求完成时间(越少越好):

测试项目 90%(ms) 99%(ms) 100%(ms)
Nginx/1.16.1 0 0 40
Apache/2.4.41 0 0 213
My_Web 0 0 10

多客户端测试

测试命令 ab -n 500000 -c 520 http:127.0.0.1:<端口号>/

完成时间(越少越好):

image

每秒完成请求数(越多越好):

image

每个请求花费的时间(越少越好):

image

百分比请求完成时间(越少越好):

测试项目 90%(ms) 99%(ms) 100%(ms)
Nginx/1.16.1 30 39 1247
Apache/2.4.41 33 244 1475
My_Web 29 37 1045

Webbenchv1.5

测试命令:

./webbench http://127.0.0.1:<端口号>/ -2 --get -c <客户端数量>

单客户端测试

Nginx结果

image

My_Web结果

image

10个客户端测试

Nginx结果

image

My_Web结果

image

3000个客户端测试

Nginx结果

image

My_Web结果

image

内存泄漏测试(valgrind-3.15.0)

单线程测试命令

valgrind --leak-check=full --show-reachable=no ./my_web

ab -r -n 100000 -c 1 http://127.0.0.1:8080/index.html

image

ab -r -n 100000 -c 520 http://127.0.0.1:8080/index.html

image

多线程测试命令

valgrind --leak-check=full --show-reachable=no ./my_web

ab -r -n 100000 -c 1 http://127.0.0.1:8080/index.html

image

ab -r -n 100000 -c 520 http://127.0.0.1:8080/index.html

image

在单线程和多线程的情况下,表现良好,无明显内存泄漏。

安装和运行

首先请保证您的计算机上安装了cmake>=3.15版本,可以使用软件源来进行安装

  • Ubuntu : sudo apt-get install cmake
  • Centos: sudo yum install cmake
  • Fedora: sudo dnf install cmake
  • Manjaro: sudo pacman -S cmake

安装后,可能需要保证您的内核支持SO_REUSEPORT特性,虽然现在内核基本都支持,可能会有特殊,然后您可以通过git等方式进行下载

  • 进入到相应的目录
  • mkdir build
  • cd build
  • cmake ..
  • make
  • cd ../config
  • sudo cp my_web.json /etc/my_web.json
  • cd ../build
  • ./my_web

配置说明

config目录下有一个my_web.json文件,此文件为配置文件,您应该放在/etc/目录之下

my_web.json中的含义

  • server port表示您所想绑定的端口
  • sevrer threads表示您想要创建的线程数
  • serverip表示您所想绑定的ip地址
  • server keep_connection_ms表示超过多长时间就断开链接,单位为ms
  • server keep_connection_number 连接服务器多少人数之后开始淘汰,一般建议不小于10
  • sites wwwroot 表示默认目录位置
  • sites default_file表示默认显示文件
  • Fastcgi下为fastcgi的ip和端口

About

A C++ High Performance Web Server

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages