Skip to content

chenmengangzhi29/web_server

Repository files navigation

web_server

项目简介

epoll + socket + mmap + pipe + signal + mutex + cond + semaphore + tcp + mysql + 单例模式

  • 实现 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型
  • 使用主从状态机解析HTTP请求报文,支持解析GET和POST请求
  • 实现用户 注册、登录功能,支持请求服务器图片和视频文件
  • 实现同步/异步日志系统,记录服务器运行状态。实现数据库连接池提升数据库读写速度。实现定时器处理非活动连接
  • 经Webbench压力测试,可实现上万的并发连接数据交换

webserver架构图

线程池流程图

压力测试结果

使用webbench对服务器进行压力测试,采用不同并发模型(Proactor或Reactor),并对listenfd和connfd分别采用ET和LT模式,均可实现上万的并发连接,测试结果如下图:

  • 并发连接总数:10000
  • 访问服务器时间: 5s
  • 所有访问均成功
  • Proactor, LT + LT,
  • Proactor, LT + ET,
  • Proactor, ET + LT
  • Proactor, ET + ET
  • Reactor, LT + LT
  • Reactor, LT + ET
  • Reactor, ET + LT
  • Reactor, ET + ET

快速开始

  • 测试前确认已安装MySQL数据库
// 建立yourdb库
create database yourdb;

// 创建user表
USE yourdb;
CREATE TABLE user(
    username char(50) NULL,
    passwd char(50) NULL
)ENGINE=InnoDB;

//添加数据
INSERT INTO user(username, passwd) VALUES('name', 'passwd');
  • 修改main.cpp中的数据库初始化信息
// 数据库登录名,密码,库名
string user = "root";
string passwd = "root";
string databasename = "yourdb";
  • 编译运行
sh ./script.sh build
./build/web_server
  • 安装压力测试工具
cd test_pressure/webbench-1.5
sudo make install
  • 浏览器访问
ip:9006

个性化运行

  • 参数介绍
// 设置端口号,默认9006
-p 端口号

// 设置日志写入方式,选项0为同步,选项1为异步,默认同步
-l 选项

// 设置触发组合模式,包含以下选项
// 0为listenfd LT + connfd LT
// 1为listenfd LT + connfd ET
// 2为listenfd ET + connfd LT
// 3为listenfd ET + connfd ET
// 默认为0
-m 选项

// 设置优雅关闭连接,选项0为不启动,选项1为启动,默认0不启动
-o 选项

// 设置数据库连接池中的连接数量,默认为8
-s 连接数量

// 设置线程池内线程数量,默认为8
-t 线程数量

// 是否关闭日志,选项0为不关闭,选项1为关闭,默认为0
-c 选项

// 设置并发模型,选项0为proactor, 选项1为reactor,m默认为0
-a 选项
  • 示例
// 启动服务器,选用9006作为端口号,同步写入日志,
// 触发组合模式为listenfd LT + connfd LT,
// 不启动优雅关闭连接,数据库连接池中连接数量为8,
// 线程池内线程数量为8,不关闭日志,并发模型选择proactor
./build/web_server -p 9006 -l 0 -m 0 -o 0 -s 8 -t 8 -c 0 -a 0

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published