C++ Webserver从零开始:代码书写(十六)——配置文件,服务器,启动!

avatar
作者
筋斗云
阅读量:4

前言

现在是2024年2月28日的晚上20点36分,我完成了博客的所有内容。现在我整个人有一种如释重负的感觉,今天用webbench测试的时候还闹了个笑话,我在使用测试命令时,url多写了一个http://没注意,导致webbench访问服务器一直被拒,我一度以为是我代码有问题。还跑到群里,社区里求助,也给我一个同学发了过去。网上也搜索了很久,甚至我还跑去看webbench的源码。但是显而易见地一无所获。就在我心灰易冷地时候,我发现了我给我同学发的出错照片里面的webbecn调用返回信息有两个http://,但哪怕是这样我也没反应过来是我的url写错了,我还问他有没有什么头绪,是不是webbench的url解析代码有问题?后来等我发现是我打错了的时候,再看聊天记录发现他以及说了答案“重复了”,搞得我哭笑不得。好在发现了问题所在,webbench正常使用,让本专栏得以完结(差点烂尾)

配置文件和main文件

配置文件和main文件就不讲了,直接贴代码,感兴趣的同学自己看看

#ifndef CONFIG_H #define CONFIG_H  #include "webserver.h"  using namespace std;  class Config { public:     Config();     ~Config(){};      void parse_arg(int argc, char*argv[]);      //端口号     int PORT;      //日志写入方式     int LOGWrite;      //触发组合模式     int TRIGMode;      //listenfd触发模式     int LISTENTrigmode;      //connfd触发模式     int CONNTrigmode;      //优雅关闭链接     int OPT_LINGER;      //数据库连接池数量     int sql_num;      //线程池内的线程数量     int thread_num;      //是否关闭日志     int close_log;      //并发模型选择     int actor_model; };  #endif
#include "config.h"  Config::Config(){     //端口号,默认9006     PORT = 9006;     //PORT = 9000;      //日志写入方式,默认同步     LOGWrite = 0;      //触发组合模式,默认listenfd LT + connfd LT     TRIGMode = 0;      //listenfd触发模式,默认LT     LISTENTrigmode = 0;      //connfd触发模式,默认LT     CONNTrigmode = 0;      //优雅关闭链接,默认不使用     OPT_LINGER = 0;      //数据库连接池数量,默认8     sql_num = 8;      //线程池内的线程数量,默认8     thread_num = 8;      //关闭日志,默认不关闭     close_log = 0;      //并发模型,默认是proactor     actor_model = 0; }  void Config::parse_arg(int argc, char*argv[]){     int opt;     const char *str = "p:l:m:o:s:t:c:a:";     while ((opt = getopt(argc, argv, str)) != -1)     {         switch (opt)         {         case 'p':         {             PORT = atoi(optarg);             break;         }         case 'l':         {             LOGWrite = atoi(optarg);             break;         }         case 'm':         {             TRIGMode = atoi(optarg);             break;         }         case 'o':         {             OPT_LINGER = atoi(optarg);             break;         }         case 's':         {             sql_num = atoi(optarg);             break;         }         case 't':         {             thread_num = atoi(optarg);             break;         }         case 'c':         {             close_log = atoi(optarg);             break;         }         case 'a':         {             actor_model = atoi(optarg);             break;         }         default:             break;         }     } }
#include "config.h"  int main(int argc, char *argv[]) {     //需要修改的数据库信息,登录名,密码,库名     string user = "root";     string passwd = "123";     string databasename = "testDB";      //命令行解析     Config config;     config.parse_arg(argc, argv);      WebServer server;      //初始化     server.init(config.PORT, user, passwd, databasename, config.LOGWrite,                  config.OPT_LINGER, config.TRIGMode,  config.sql_num,  config.thread_num,                  config.close_log, config.actor_model);           //日志     server.log_write();      //数据库     server.sql_pool();      //线程池     server.thread_pool();      //触发模式     server.trig_mode();      //监听     server.eventListen();      //运行     server.eventLoop();      return 0; }

makefile

CXX ?= g++  DEBUG ?= 0 ifeq ($(DEBUG), 1)     CXXFLAGS += -g else     CXXFLAGS += -O2  endif  server: main.cpp  ./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cpp  webserver.cpp config.cpp 	$(CXX) -o server  $^ $(CXXFLAGS) -lpthread -lmysqlclient  clean: 	rm  -r server 

运行

创建数据库

将上述文件全部保存到根目录后,运行make命令,就可以得到server文件了

快速运行:./server

自定义运行:./server [-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,listenfd和connfd的模式组合,默认使用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模型

压力测试

webbench原理

webbench是一个开源的用来测试服务器性能的小软件,其基本原理是创建多个子进程进行服务器访问,子进程将自己得到的数据通过管道发给主进程,主进程将结果统计打印输出在屏幕上

测试结果

压力测试使用的webbench-1.5版本,因为我的云服务器是2核2G,webbench本身也会创建非常多进程,所以并发量只能达到4800,换一个硬件环境应该能达到更高的数据。

可以看到,在跑webbench的时候,我的服务器的内存最高差不多跑到了1800多,基本上是给内存全部跑慢了,对于一个2G的内存来说,这已经是接近极限的数字。而系统盘IO达到了差不多40000KB/s,从这个角度上来看,我的服务器应该没有什么大的性能瓶颈了。

结束语

这个专栏到这里就结束了,完成了所有的东西我还是非常开心的,后面找些时间把github上的README整理一下,我的webserver之旅就彻底完结。


润了~~o(* ̄▽ ̄*)ブ

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!