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