corenet轻量级网络库

介绍

本项目提供一种轻量级的网络库,设计思想是one loop per thread + thread pool。
项目已实现:
1、基于TCP的简单聊天室;
2、简单的HTTP服务器(webbench测试的QPS可以达到1万),其中包括功能:用户登录、注册、权限控制、文件上传、文件下载、已上传视频播放、已上传图片展示;(由于使用url传递文件名称,因此展示不支持会经过url转义的文件)
注:该项目实现参考muduo,仅为学习使用。

软件架构

软件架构说明

在这里插入图片描述
注:日志系统参考muduo,为异步日志(多个前台线程写日志,单个后台线程进行IO)

内存池说明

在这里插入图片描述
注(2020/06/11):
内存池的设计可以更加紧凑点,即使链表指针和数据放在一个union;

安装教程

  1. ubuntu
  2. google protobuf
  3. mysql

使用说明

  1. 阅读main.cpp
  2. 关于聊天室:使用SERVER宏定义当前编译是否为服务器端,
  3. 关于HTTP服务器:详细配置在Config.h文件中;
    demo:http://116.62.24.202:8080/login

HTTP服务器命令: 
a)运行命令:corenet -p 8080 -a 0;  
其中p表示端口号;a表示是否开启权限认证(当为1时,开启权限认证,ghost账号不可用)    
b)退出命令:\exit;

HTTP服务器实现简述:  
a)实现中,HttpProcessor为核心处理类,    
b)PreIntercepterFunc为预处理器(可以进行权限控制);  
c)HandlerHashMap为url和HandlerFunc映射器,由注册的url进行map到对应的HandlerFunc业务处理器;  
d)PostIntercepterFunc为后处理器(可以进行响应统计);   

HTTP服务器当前功能描述:   
a)登录页面 /login;  ——初始用户名/密码:ghost/1
b)注册页面 /register;  
c)上传文件页面 /upload;  
d)查看已上传文件 /resource;  
e)点击/resource页面中链接,可跳转到对应的资源;   

视频演示demo:https://gitee.com/wangjinchaoXY/corenet/raw/master/ref.mp4

HttpServer调试简记(2020.05.29)

  1. 问题:第一次测试QPS=85,低得离谱。为什么?
    在这里插入图片描述
    原因:原始的HttpServer对于所有TCP都使用短连接。而webbench默认时候用长连接; 此外,在accept时,可以循环一下,直至没有可以接受的已连接TCP,这样在高并发的情况下,可以避免额外而频繁的epoll_wait中的内核和用户态切换
    补充:这个可以使用wireshark或者tcpdump抓包看一下
  2. 问题:使用netstat -an查看tcp连接情况。发现大量处于close-wait状态;
    原因:close-wait是对方提出关闭。服务器recv返回0时,没有close,导致TCP的服务器端无法正常关闭;
  3. 问题:使用netstat -an查看tcp连接情况。发现大量处于time-wait状态;
    原因:这是TCP的保证正常关闭的机制。等一段时间2MSL,就会消失。(也可以主动设端一点时间,此外是否可以直接发送RST强制关闭,而不走正常流程??)
  4. 问题:QPS依然只有2988.
    在这里插入图片描述
    原因:使用tcpdump -ttt抓包,看到HTTP响应延迟得有300-400us左右,这说明是服务器处理一个连接的速度太慢。之后为了查找原因,在关键地方打印时间戳,没有找到原因。但这样处理后,好像QPS更低了点。最后突然想到是不是这些多余的日志的问题。因此选择关闭日志,并检查全文,并检查源文件是否有多余的处理。果然,这样之后QPS可以达到12662了。(为什么会这样?虽然日志是异步的,但是本身要写入日志的数据的生成是需要耗时的,此外日志插入队列是需要加锁的。。。)
  5. 问题:循环对socket进行accept,直至返回0,带来的提升有多大?
    测试结果(多次webbench取峰值):每次epoll触发读时间,只accept一次,达到的QPS为10748;而循环对socket进行accept,可以达到12662.性能提升大概为18%;
  6. 思考:在对每次的HTTP进行响应时,从上次业务准备好,到实际发送数据到socket,会经历一次epoll_wait的调用(等待写事件的触发)。但实际上,此时,sockets往往是可写的,可能不需要直接调用epoll_wait;
  7. 此时服务器的性能瓶颈在哪里?
    网络本身的延迟,HTML文件读取时间等;
    也可以使用Nginx、CDN等提升性能。

其它

  1. 程序运行8小时后,出现无法登陆,为数据库连接失效,目前解决方案是在取mysql连接的同时PING一下。(其它解决方案:定期执行查询、设置数据库的连接超时时间)

参与贡献

  1. Fork 本仓库
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request

致谢

  1. 《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕)
  2. https://github.com/qinguoyi/TinyWebServer.git

码云链接

corenet轻量级网络库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值