C++从0实现Reactor高并发网络服务器 复习与回顾(8)

C++从0实现Reactor高并发网络服务器 复习与回顾(1)

(25)服务程序的退出

截止目前程序是一直运行的,只能Ctrl+C暴力终止。采用信号的停止主从事件循环和工作线程。

在EchoServer类中增加停止的成员函数,因为工作线程(线程池类对象)是属于EchoServer的对象,因此可以在其中直接调用ThreadPool的停止所有线程的成员函数关掉工作线程。
但是IO线程是属于TcpServer类的对象,因此EchoServer类中停止的成员函数不能直接 操作IO线程的线程池,因此也在TcpServer类中增加停止IO线程和事件循环的成员函数(停止主从事件循环和IO线程)。**实现细节是:**在EventLoop类中增加停止的标志成员变量,并增加停止事件循环的成员函数,在其中设置标志位,这样事件循环的while(标志位)函数就能感知到,尽管设置了标志位,但是事件循环阻塞在epoll_wait函数,只有超时或者闹钟响了(定时器到时)才会返回,因此在设置标志位后应该立即唤醒事件循环让epoll_wait返回,这样下次循环就会退出。

(26)Buffer的设计

截止目前程序只支持报文头部+报文内容的方式,不灵活,因此增加不同的报文分隔符,包括但不限于
1、无分隔符(固定长度,视频会议)2、四字节的报头3、"\r\n\r\n"分隔符(http协议)。

截止目前,报文分隔符的区分标志位还是需要手动修改的,正确的做法是由服务程序传给EchoServer,再依次传给TcpServer、Connection,最后在Connection的构造函数中传给Buffer。

网络服务程序的Buffer设计非常重要,更深入的可以参考陈硕书的7.4节关于Buffer设计的介绍。

(27)性能测试

在这里插入图片描述
我采用的测试机是i9 9900kCPU的VM虚拟机,内存8G,虚拟linux系统分配8个核心,当然这样并不是真正意义上的8核CPU,因为虚拟机存在明显的性能衰减。

没有运行服务程序CPU空闲100%。
设置IO线程为8,工作线程为0。(这时不需要什么计算,因此计算部分也交给IO线程,增加工作线程反而会降低速度。)设置客户端发送10万个报文,然后运行服务端程序和客户端程序测试QPS。
从下图结果显示:QPS = 1.2w/s,CPU占用8%。
在这里插入图片描述

在这里插入图片描述

一个客户端不能发挥服务程序多线程的优势。写sh脚本开启20个客户端,每个客户端发送10万个报文。测试QPS。
结果:200万个报文8s完成,QPS:25w/s。
在这里插入图片描述
在这里插入图片描述
项目中的服务器配置要比当前的测试机好太多,多核CPU能同时运行更多的客户端,以充分发挥服务程序多线程的优势。可以轻松测得百万QPS。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值