TinywebServer代码详解– 调试编译运行与压力测试(15)

原项目地址(点击跳转)

博主添加注释后项目地址(点击跳转)


一、环境

该项目,用到的额外的库,有JSONCPP用于对JSON数据进行解析以及MYSQL库用于连接数据库

1.JSON库

使用命令安装

1
2
$ sudo apt-get update
$ sudo apt-get install libjsoncpp-dev


2.MYSQL

安装以及简单的操作,可以进行跳转至链接:UBUNTU下安装MYSQL




二、调试与编译运行

1.调试

使用make命令,对每一个模块生成目标文件(.o文件),而不进行链接。这样做的优点:

快速编译:开发者可能只想快速编译一个文件来检查语法错误或其他问题(可以模块化对错误问题进行定位),而不进行完整的构建过程

部分更新:在大型项目中,如果只修改了一个文件,使用 make 可以仅重新编译该文件对应的对象文件,提高编译效率(后续可以通过命令将多个目标文件进行链接为一个可执行文件

模块化测试:在某些情况下,开发者可能需要构建特定的对象文件以进行单元测试或模块测试


(1)CGImysql

在该目录的终端下,运行如下命令

1
$ make sql_connection_pool.o

执行结果:

image-20240715170752854

数据库连接池模块中,无语法问题


(2)http

在该目录的终端下,运行如下命令

1
$ make http_conn.o

执行结果:

image-20240715170944161

http连接模块中,无语法问题


(3)lock

模板类,仅有头文件,无法编译为目标文件


(4)log

在该目录的终端下,运行如下命令

1
$ make log.o

执行结果:

image-20240715171221249

log日志模块中,无语法问题


(5)timer

在该目录的终端下,运行如下命令

1
$ make lst_timer.o

执行结果:

image-20240715171353148

定时器模块中,无语法问题


(6)config

在该目录的终端下,运行如下命令

1
$ make config.o

执行结果:

image-20240715171519263

处理配置文件的源文件中,无语法问题


(7)webserver

在该目录的终端下,运行如下命令

1
$ make webserver.o

执行结果:

image-20240715171653674

服务器主程序的源文件中,无语法问题



2.编译运行

  • 服务器测试环境

    Ubuntu版本 20.01.4 LTS

    MYSQL版本 8.0.37

  • 浏览器测试环境

    Windows、Linux均可

    Chrome

    • 测试前确认以安装MYSQL数据库
1
2
3
4
5
6
7
8
9
10
11
12
// 建立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');
  • 在dbconf.json文件中初始化数据库相关信息
1
2
3
4
5
6
7
// 数据库服务器端口、用户名、密码、库名
{
"db_port": 3306,
"userName": "zxz",
"password": "123456",
"dbName": "serverdb"
}
  • 项目整体的目录结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(base) zxz@ubuntu:~/Proj/C_C++/WebServer/TinyWebServerBymyself$ tree
.
├── build
│   └── 编译产生的中间文件
├── CGImysql
│   ├── sql_connection_pool.cpp
│   └── sql_connection_pool.h
├── CMakeLists.txt
├── config.cpp
├── config.h
├── dbconf.json
├── http
│   ├── http_conn.cpp
│   └── http_conn.h
├── lock
│   ├── locker.h
│   └── README.md
├── log
│   ├── block_queue.h
│   ├── log.cpp
│   └── log.h
├── main.cpp
├── root
│   └── 各种资源文件...
├── threadpool
│   ├── README.md
│   └── threadpool.h
├── timer
│   ├── lst_timer.cpp
│   └── lst_timer.h
├── TinyWebServerBymyself
├── webserver.cpp
└── webserver.h
  • 编译

在项目目录TinyWebServerBymyself下的build目录中

1
2
$ cmake ..
$ make

生成的可执行文件在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:

image-20240715202402720

浏览器端,打开指定网页

运行服务器程序后,在浏览器中输入,就可以访问服务器

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表示时间

  • ProactorLT + LT,19753QPS

image-20240716112824735

  • ProactorLT + ET,20164QPS

image-20240716113008217

  • ProactorET + LT,18084QPS

image-20240716113242320

  • ProactorET + ET,17892QPS

image-20240716113421004

  • ReactorLT + ET,15965QPS

image-20240716113559496

并发总连接数:10500

访问服务器时间:5s

所有访问均成功