本文由逍遥子撰写,转发请标注原址:

http://blog.csdn.net/houjixin/article/details/46413941

http://houjixin.blog.163.com/blog/static/356284102015584617535/

9.1、空闲空间管理机制优化

Mosquito原始版本程序中,有新的连接进来时,需要扫描整个context,查找一个空闲的位置以存放新连接产生的context,如果找不到空闲位置,则使用realloc再扩充一个context的位置。这种操作方式有两点非常低效:

1)  扫描context,每次有新连接进来的时候都要扫描context数组以查找一个空闲的context位置;

2)  当前context数组中不没有空闲的contxt时,只用realloc扩充1个位置;

针对上述两个造成低效的原因,将采用以下两种对应的方式进行优化:

1)  针对全扫描context数组的问题,将增加一个动态数组,用以保存当前所有空闲context的索引,当有新连接进来时直接从该动态数组中获取,而不需要每次都扫描全部的context数组;

2)  针对realloc只扩充一个context位置的问题,修改为每次context空间不够用时,将调用realloc申请一批(例如1000个)context的位置,然后将这些空闲位置的索引放入动态数组中。

9.2、消息发送机制优化

9.2.1    优化原因

Mosquitto原始版本的消息发送机制中将消息的接收和转发分开处理,其顺序为:

1)  在mosquitto_main_loop函数中根据poll返回的结果,如果一个就绪的socket是向某个主题发送消息,则搜索所有的订阅树,查找订阅了该主题的所有的订阅列表,并将该消息挂到订阅列表中每个context的消息队列中,此时,消息并未发送到订阅者。

2)  在函数mosquitto_main_loop中集中扫描所有的context并发送消息:如果其消息队列不空,则将消息队列中的消息发送出去。

这种消息发送机制的优点是逻辑清晰,但其效率非常低,因为每次消息发送时都需要扫描所有的context,才能确定哪些context有消息发送,哪些没有。

9.2.2 优化方法

针对mosquitto消息发送机制中需要全扫描所有context造成的低效问题,本次优化将增加一个hash表,该hash表将保存所有带消息的context,在消息发送时只扫描这个hash中的context即可,而不需要扫描全部的context,进而提升系统的运行效率,具体操作为:

1)  定义一个hash表,该表中每个结构包括一个socket和一个该socket对应的context,此表用于存放所有消息队列不空的context。

2)  将消息队列不空的context放入hash表,此过程在对epoll返回结果的处理中完成。该过程像poll一样,需要先搜索订阅树,查询订阅了该主题的所有订阅列表,并将消息挂到订阅列表的每个context中,如果该context未再hash表中,则将其加入hash表。

3)  发送消息,遍历hash表,将hash表中context的消息发送出去。

原来的mosquitto程序中,当有消息发送时,需要查询订阅树,找到对应主题的订阅列表,然后将消息挂到订阅列表中的每个context中,当客户端数量非常大时,每次发送消息查询订阅树都会花费一定时间,造成资源的严重浪费。

针对上述消息发送机制的问题,采用hash表存储topic到订阅列表的映射,在消息发送时只需要根据topic查找hash表,不需查找订阅树,从而减少系统资源的消耗。

Mosquito的优化——其他优化(九)相关推荐

  1. 固态硬盘win7优化指南:九个Win7固态硬盘优化方法

    固态硬盘win7优化指南:九个Win7固态硬盘优化方法 随着固态硬盘价格不断下降,目前固态硬盘也得到了广泛了应用,一些新笔记本以及组装电脑也开始普遍采用固态硬盘平台,超级本就更不用说了,采用固态硬盘已 ...

  2. 数据库设计与优化 - MySQL优化策略

    MySQL服务器操作层架构 MySQL语句的优化就发生MySQL Server服务器架构的操作层,这层具体的执行流程是: 这层主要的功能是: SQL 语句的解析.优化,缓存的查询,MySQL 内置函数 ...

  3. mysql字段优化_MySQL优化(1):字段的设计

    Web项目中,当Java或者Go等语言速度提升到瓶颈的时候,我们需要关心MySQL的优化 可以优化的方面有很多:设计表.负载均衡.读写分离.SQL语句优化等 (1)IP地址设计 例如我们需要存储IP地 ...

  4. android布局优化方案,Android启动优化-布局优化

    Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...

  5. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  6. Android性能优化 - 内存优化

    性能优化系列阅读 Android性能优化 性能优化 - 消除卡顿 性能优化- 内存优化 性能分析工具 - TraceView Android性能分析工具 为什么内存优化? 在一个商业项目中,很有可能因 ...

  7. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...

    目录: Oracle数据完整性和锁机制  索引及优化之表分析  表分析.约束及表间关系  Oracle体系结构1 Oracle体系结构2  海量数据库及分区1  海量数据库及分区2  海量数据库及分区 ...

  8. 【学习笔记】多重背包相关优化——二进制优化/单调队列优化

    多重背包--二进制优化/单调队列优化 二进制优化 单调队列优化 代码都是 POJ1742 的,注意,那道题二进制优化会超时. 普通的多重背包式子,物品个数限制:c[i]c[i]c[i],单个物品价值 ...

  9. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法(作业:优化方法)

    文章目录 1. 梯度下降 2. mini-Batch 梯度下降 3. 动量 4. Adam 5. 不同优化算法下的模型 5.1 Mini-batch梯度下降 5.2 带动量的Mini-batch梯度下 ...

  10. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法

    文章目录 1. Mini-batch 梯度下降 2. 理解 mini-batch 梯度下降 3. 指数加权平均数 4. 理解指数加权平均数 5. 指数加权平均的偏差修正 6. 动量Momentum梯度 ...

最新文章

  1. python引流_Python为什么值得学习?(下)
  2. 自动驾驶视觉融合-相机校准与激光点云投影
  3. EntityFramework SaveChange()方法不能更新的问题
  4. Unity光照与渲染设置学习笔记
  5. Zabbix基础概念
  6. matlab cameraman,cameraman.tif 原图
  7. 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
  8. IT Monitor
  9. 2018-2019 1 20165203 实验五 通用协议设计
  10. mysql 支持json_MySQL 5.7 对 JSON 的支持
  11. Mono源代码学习笔记:Console类(五)
  12. Turtle(7)制作简单动画
  13. houseprice_analysis_广州房子租售比分析(中)
  14. SpringBoot集成海康威视Linux版本
  15. 【加密算法】凯撒密码的原理及Python实现
  16. 【devops】非必要 不要自建harbor 能力不足 真的被坑的服了 阿里云ACR不香吗?k8s接入ACR
  17. iptables结合ipset禁止国外IP进行访问
  18. python 频数统计_日常答疑:Python实现分类频数统计
  19. [ BZOJ 2757 ]Blinker的仰慕者
  20. 中软国际首届嘉年华晚会召开 “解放号”勿忘初心再起航

热门文章

  1. 优达学城深度学习之五——卷积神经网络
  2. 两个关于JAVA String的小问题
  3. 使用python写程序时遇到的几个小问题
  4. php多图片上传封装类,php----图片上传封装类:单张,多张图片上传,生成缩略图...
  5. nexbox本地网络调试工具下载_「下载」 Windows 10 WinDBG 分析转储日志和蓝屏日志排查错误原因...
  6. python声音捕获_在Python中实现实时信号处理如何连续捕获音频?
  7. 功放音量调节原理_汽车音响知识关于功放和低音喇叭的匹配
  8. linux work有关的命令,VM workstation 中linux 命令
  9. android判断是否已经安装成功,android 判断应用程序是否已安装
  10. java评论回复功能例子_Java实现评论回复功能的完整步骤