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

谈谈Boost网络编程(3)—— 一些坑

很多时候,我们以为采用了一种新技术(尤其是成熟的技术),过程应该是一马平川的。然而实际上,采用新技术的过程却是掉入了各种坑里。究其原因,或者是使用方式有问题,或者是效率的白白浪费。这一章,我想讲讲,我在使用Boost Asio进程网络编程时,所遇到的各种坑。

其一、CPU占用100%问题。

在没有采用异步编程之前,程序占用100%基本是不敢想象的事情,因为一旦程序占用100%的CPU,那必然是代码中出现了死循环的BUG。但是采用了Boost Asio后,我发现新系统很容易就跑满了CPU。Why?

1)服务端接收任务过快。快一直是我们系统所追求的,为此我们特别进行了优化,支持一次接收一组任务(100-300之间)。然而我们处理任务时,client一次最多只能够处理10条任务,这就是典型的生产者-消费者问题。生产者能力大于消费者,而且消费者在消化时(HTTP发送任务时),对方反馈是同步反馈的,这就造成了CPU的持续增加。再则,任务完毕被发送到report_runner时,反馈任务是一条一条反馈,这又是生产能力大于了消费能力。

针对此问题,我们做了一些限制和优化:stream_server增加限速功能,report_client可以合并反馈。

2)bind意味着拷贝,尽量在bind时传递指针而不是实例。

其二、shared_ptr和多态。

如果我有一个基类的shared_ptr,我可以用它来指向具体的子类吗?答案是需要将子类的shared_ptr赋值于这个指针,否则无法实现多态。

其三、子进程问题。

由于我们的客户端只运行于linux,所以这里只描述在基于boost asio的多线程程序中如何再做到多进程。注意:这里有一个前提,子进程中只调用shell或可执行,并不用到父进程中的asio实例。

为什么要单独讲子进程问题呢?因为Boost的asio并不是fork安全的,而且其Doc中特别指出了在子进程中需要调用notify_event来通知asio以使fork安全。这至少造成了我的疑惑:如果我不需要在子进程中使用Asio,我还需要notify吗?答案是不需要。正如我们系统所遇到的,只需要调用linux的exec*即可。

进一步,由于我们并不需要拷贝父进程,所以用vfork取代了fork。

相关文章:

  • 497. 返回随机非重叠矩形中的一个坐标点
  • Referer和Referrer Policy及图片防盗链
  • ISO7816-3标准ATR解析
  • 谨慎redis的timeout参数
  • PHP 实例 - AJAX 与 XML
  • 期货开户每日无负债结算制度
  • Redis、JVM、并发、MySQL、Java、网络等一个你都“啃”不完,何谈BAT?
  • 详解 docker save 与 docker export 的区别
  • 【华为账号服务】【FAQ】Account Kit常见咨询合集--获取帐号个人信息相关问题
  • 每个人都可以用的开源微信机器人
  • 一幅长文细学华为MRS大数据开发(四)——HBase
  • Vue2、Vue3知识总结---完整版✨
  • ISME| 南农大沈其荣院士团队最新揭示根际微生物组成变化可更早预测番茄青枯病
  • java基于 ssm+jsp的线上授课作业管理系统
  • 一、Win10安装并检测GPU版本Pytorch
  • android 一些 utils
  • Babel配置的不完全指南
  • Git 使用集
  • Linux中的硬链接与软链接
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Python语法速览与机器学习开发环境搭建
  • Spark学习笔记之相关记录
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 前端性能优化——回流与重绘
  • 巧用 TypeScript (一)
  • 使用common-codec进行md5加密
  • 使用parted解决大于2T的磁盘分区
  • 学习JavaScript数据结构与算法 — 树
  • 在electron中实现跨域请求,无需更改服务器端设置
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $.ajax,axios,fetch三种ajax请求的区别
  • (16)Reactor的测试——响应式Spring的道法术器
  • (23)Linux的软硬连接
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)球球大作战
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET/C# 使用反射注册事件
  • .net访问oracle数据库性能问题
  • .考试倒计时43天!来提分啦!
  • /run/containerd/containerd.sock connect: connection refused
  • @EventListener注解使用说明
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • []常用AT命令解释()
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Assignment] C++1
  • [GXYCTF2019]BabySQli1
  • [hive] 窗口函数 ROW_NUMBER()