当前位置: 首页 > news >正文

TCP网络服务器设计

最近设计了一个网络服务器程序,对于4C8G的机器配置,TPS可以达到5W。业务处理逻辑是简单的字符串处理。服务器接收请求后对下游进行类似广播的发送。在此分享一下设计方式,如果有改进思路欢迎大家交流分享。

程序运行在CentOS7.9操作系统上,GCC使用4.8.5版本,网络是千兆网。

接收流程

展示如下:

 

epollin进来之后会进行会话组的读锁锁定,这样会话不可能在上锁期间析构掉,保证了会话指针(包括其内部的接收缓存)的安全。在会话处理内部对消息缓冲区进行了尝试上锁。如果上锁失败则返回(这样保证了如果一个会话的数据特别多,其他网络接收线程也可以及时处理其他会话进来的数据)。

 发送流程

如下:

发送线程有两种模式:直接发送、缓冲发送。直接发送模式就是直接将需要发送的数据发送处理,缓冲发送是将数据写到会话的缓冲区,然后进行发送。直接发送的好处就是可以不用复制数据,这样可以减少CPU和内存的占用,但是坏处就是由于没有对于每个会话进行单独的缓冲,因此需要遍历每个会话,对数据进行依次发送。此时,如果有一个会话的接收速度特别慢,就会导致整体的发送效率降低。缓冲发送模式则不存在这个问题,一个会话的接收速度慢,但是它有自己的缓冲区,所以可以直接把数据复制到它的缓冲区中,然后继续下一个会话的发送。

系统使用优先直接发送,如果遇到EAGAIN时候直接转到缓冲区发送的方式。这样就可以保证尽量不复制缓冲区,同时在发送遇到阻塞时候也能不影响其他会话。

 效果测试

在5W的TPS下可以接收8个下游系统,上下游网络流量已经几乎达到带宽极值,CPU占用率67%,内存在运行48小时后会达到78M。

但是还是存在问题。1)单独使用缓存发送模式的时候有一个问题,就是CPU占用率特别高,每多一个会话则CPU的占用率升值需要升高10%-20%(这里似乎没有CAS导致的CPU占用,同时,使用的锁也全都是普通锁,并没有自旋锁);2)下游接收速度很慢的时候CPU占用率会提高到70%以上。

http://www.lryc.cn/news/113120.html

相关文章:

  • 4. C++构造函数和析构函数
  • 【Spring Cloud 四】Ribbon负载均衡
  • “星闪”:60%能耗 6倍速度 1/30时延**
  • cocosCreator 之 i18n多语言插件
  • redis 如何保证数据一致性
  • 因果推断(三)双重差分法(DID)
  • neo4j入门实例介绍
  • CGAL-2D和3D线性几何内核-点和向量-内核扩展
  • Ubuntu 22.04 安装docker
  • 电脑维护进阶:让你的“战友”更强大、更持久!
  • 【Leetcode】75.颜色分类
  • Pytesseract学习笔记
  • cnvd通用型证书获取姿势
  • elasticsearch的副本和分片的区别
  • Docker部署Gitlab
  • ABeam News | ABeam大中华区新人入社式,开启崭新的职场探索之旅吧!
  • 【C++】开源:sqlite3数据库配置使用
  • [Docker实现测试部署CI/CD----Jenkins集成相关服务器(3)]
  • 【Shell】基础语法(二)
  • Unity之webgl端通过vue3接入腾讯云联络中心SDK
  • 《算法竞赛·快冲300题》每日一题:“连接草坪(II)”
  • LNMP及论坛搭建(第一个访问,单节点)
  • EXCEL,多条件查询数字/文本内容的4种方法
  • 全志D1-H (MQ-Pro)驱动 OV5640 摄像头
  • 2023下半年软考初级网络管理员报名入口-报名流程-备考方法
  • QEMU源码全解析29 —— QOM介绍(18)
  • 从入门到精通——【初识网络】
  • MySQL alter命令修改表详解
  • Vulnhub: ColddWorld: Immersion靶机
  • Redis 总结【6.0版本的】