TinywebServer代码详解-调试编译运行与压力测试(15)
TinywebServer代码详解– 调试编译运行与压力测试(15)
原项目地址(点击跳转)
博主添加注释后项目地址(点击跳转)
一、环境
该项目,用到的额外的库,有JSONCPP
用于对JSON
数据进行解析以及MYSQL
库用于连接数据库
1.JSON库
使用命令安装
1 | $ sudo apt-get update |
2.MYSQL
安装以及简单的操作,可以进行跳转至链接:UBUNTU
下安装MYSQL
二、调试与编译运行
1.调试
使用make
命令,对每一个模块生成目标文件(.o
文件),而不进行链接。这样做的优点:
快速编译:开发者可能只想快速编译一个文件来检查语法错误或其他问题(可以模块化对错误问题进行定位),而不进行完整的构建过程
部分更新:在大型项目中,如果只修改了一个文件,使用
make
可以仅重新编译该文件对应的对象文件,提高编译效率(后续可以通过命令将多个目标文件进行链接为一个可执行文件)模块化测试:在某些情况下,开发者可能需要构建特定的对象文件以进行单元测试或模块测试
(1)CGImysql
在该目录的终端下,运行如下命令
1 | $ make sql_connection_pool.o |
执行结果:
数据库连接池模块中,无语法问题
(2)http
在该目录的终端下,运行如下命令
1 | $ make http_conn.o |
执行结果:
http
连接模块中,无语法问题
(3)lock
模板类,仅有头文件,无法编译为目标文件
(4)log
在该目录的终端下,运行如下命令
1 | $ make log.o |
执行结果:
log
日志模块中,无语法问题
(5)timer
在该目录的终端下,运行如下命令
1 | $ make lst_timer.o |
执行结果:
定时器模块中,无语法问题
(6)config
在该目录的终端下,运行如下命令
1 | $ make config.o |
执行结果:
处理配置文件的源文件中,无语法问题
(7)webserver
在该目录的终端下,运行如下命令
1 | $ make webserver.o |
执行结果:
服务器主程序的源文件中,无语法问题
2.编译运行
服务器测试环境
Ubuntu版本 20.01.4 LTS
MYSQL版本 8.0.37
浏览器测试环境
Windows、Linux均可
Chrome
- 测试前确认以安装
MYSQL
数据库
- 测试前确认以安装
1 | // 建立yourdb库 |
- 在dbconf.json文件中初始化数据库相关信息
1 | // 数据库服务器端口、用户名、密码、库名 |
- 项目整体的目录结构如下:
1 | (base) zxz@ubuntu:~/Proj/C_C++/WebServer/TinyWebServerBymyself$ tree |
- 编译:
在项目目录TinyWebServerBymyself
下的build
目录中
1 | $ cmake .. |
生成的可执行文件在TinyWebServerBymyself
目录下
- 默认运行:
1 | $ ./TinyWebServerBymyself |
- 个性化运行:
1 | $ ./TinyWebServerBymyself [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model] |
以上参数不是非必须,不用全部使用,根据个人情况搭配选用即可
p
,自定义端口号
- 默认9006
l
,选择日志写入方式,默认同步写入
- 0,同步写入
- 1,异步写入
m
,监听套接字和通信套接字的事件触发模式组合,默认使用LT + LT
- 0,表示使用LT + LT
- 1,表示使用LT + ET
- 2,表示使用ET + LT
- 3,表示使用ET + ET
o
,优雅关闭连接,默认不使用
- 0,不使用
- 1,使用
s
,数据库连接数量
- 默认为8
t
,线程数量
- 默认为8
c
,关闭日志,默认打开
- 0,打开日志
- 1,关闭日志
a
,选择反应堆模型,默认Proactor
- 0,Proactor模型
- 1,Reactor模型
测试用例命令
1 | ./TinyWebServerBymyself -p 9007 -l 1 -m 3 -o 1 -s 10 -t 10 -c 1 -a 0 |
端口默认 9007
异步写入日志
使用ET + ET的事件触发模式
使用优雅关闭连接
数据库连接池中有10条连接
线程池中有10条工作线程
打开日志
Proactor事件处理模型
在Linux终端使用ifconfig
命令查看,服务器主机IP:
浏览器端,打开指定网页:
运行服务器程序后,在浏览器中输入,就可以访问服务器
1 | http://192.168.126.128:9007 |
3.压力测试
(1)Webbench压力测试工具
压力测试使用的工具为Webbench
,是一个简单但强大的网站压力测试工具,用于评估 HTTP 服务器的性能。它主要通过发送 HTTP 请求来模拟多个客户端并发访问服务器,以此来测试服务器在高负载下的表现
原理:
客户端模式:父进程
fork
若干个子进程,每个子进程在用户要求时间或默认的时间内对目标webserver
循环发出实际访问请求,父子进程通过管道进行通信,子进程通过管道写端向父进程传递在若干次请求访问完毕后记录到的总信息,父进程通过管道读端读取子进程发来的相关信息,子进程在时间到后结束,父进程在所有子进程退出后统计并给用户显示最后的测试结果,然后退出
性能指标:
成功处理的请求数:在测试期间成功得到服务器响应的请求总数
每秒请求数(
QPS
):平均每秒成功处理的查询数量传输数据量:所有请求和响应中传输的总数据量
(2)测试
服务器主机机器环境,4核CPU,单个核心的线程数为1
webbench.c
源码编译,在TinyWebServerBymyself
目录下的压力测试目录test_presure
目录下存在,压力测试工具源码,目录终端输入如下指令,编译
1 | $ gcc webbench.c -o webbench |
使用指令进行测试,终端输入如下指令
1 | ./webbench -c 10500 -t 10 http://192.168.126.128:9006/ |
-c
表示客户端数, -t
表示时间
Proactor
,LT + LT
,19753QPS
Proactor
,LT + ET
,20164QPS
Proactor
,ET + LT
,18084QPS
Proactor
,ET + ET
,17892QPS
Reactor
,LT + ET
,15965QPS
并发总连接数:10500
访问服务器时间:5s
所有访问均成功