EMQ学习---客户链接资源消耗
Erlang进程消耗
EMQ对客户端链接使用链接进程(emqtt_client)和session进程(emqtt_session)分开的策略。 当一个mqtt的客户端连接到EMQ的服务器上的时候,首先会建立一个负责管理连接的进程(emqtt_client),当验证客户端有效后会建立另一个进程(emqtt_session),负责该客户端的会话。
在EMQ中,每一个clientID只能登录一次,因此后登录的客户端会将先登录的客户端踢下线。
主要内存消耗(一个connection大约占10K内存)
数据表
当一个客户端成功完成了验证,EMQ会在mqtt_session中添加一个表项目,同时会在mqtt_local_session和mqtt_client这两张ets表中添加表项目。
进程上下文
链接进程(emqtt_client)负责接收客户端发来的数据和接受服务器内部要发送给客户端的数据,并使用编解码器进行编解码,因此链接进程的上下文消耗,主要取决接收到的数据包大小和将要发送的数据包大小和数量。
session进程(emqtt_session)会保持一个inflight队列,用来对QoS大于0的消息进行应答等待,默认会保存32个消息在等待应答,如果超过这个量级就会放入等待队列。因此session进程(emqtt_session)的主要内存消耗,取决于多少等待应答的消息,以及这些需要应答消息的数据包的大小。
主要CPU消耗
定时器
链接进程(emqtt_client),默认会启动一个心跳定时器,定期的检查链接是否存活。session进程(emqtt_session)同样会开启一个重新发送定时器,用来检查QoS大于0的消息的infligt响应,当客户端发布QoS为2的消息时还会开启另外一个定时器,用来检测REPL信息的响应,当然session进程(emqtt_session)有可能会在客户端离线后保持一段时间,因此在这段时间会建立一个超时退出的定时器。因此session进程(emqtt_session)在某一个时刻会同时存在三个定时器。
监控
session进程(emqtt_session)为了发现链接进程的退出,会建立一个针对链接进程的监控。而在客户端上线成功后后在向mqtt_local_session和mqtt_client这两张ets表中添加项目的时候,会分别建立两个监控,用来监控session进程(emqtt_session)和链接进程(emqtt_client)的退出。
进程消息
因为EMQ使用了链接进程(emqtt_client)和session进程(emqtt_session)分开的策略,因此产生进程消息传递是无法避免的。因为session进程(emqtt_session)会负责接收服务器发送给客户端的消息,并进行预先处理,处理完之后再交付给链接进(emqtt_client)程进行发送。
当使用持久化session的时候,session进程(emqtt_session)的查找和恢复时也会产生大量的进程消息。
总结
从上面的介绍中,可以看出,在部署一个EMQ服务器前需要考虑,一个客户端平均消息的量级,QoS占比和数据包大小,同时根据有多少客户端进行CPU频率和数量的选择(参考Actor模型中的调度部分)。
当运营一个EMQ服务器的时候,如果在消息量级和客户端数量没有明显变化的情况下,CPU突然飙升,就要去考虑下是否出现客户端频繁上下线的情况。当然这只是一个简单的例子,还有很多情况在此就不一一列举了
EMQ学习---客户链接资源消耗的更多相关文章
- nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫
项目简介 前端站点 项目效果预览 http://findcl.com 使用 nodejs 实现磁力链接爬虫 磁力链接解析成 torrent种子信息,保存到数据库,利用 Elasticsearch 实现 ...
- 学习tcl的资源
在这里介绍一些学习tcl的资源,有问题的时候可以尝试从这些资源中获取帮助. 网站: http://www.tcl.tk 官方站点 http://www.scriptics ...
- live555学习经验链接二
live555学习经验链接二:http://blog.csdn.net/nkmnkm/article/category/1066093/2
- live555学习经验链接一
live555学习经验链接:http://xingyunbaijunwei.blog.163.com/blog/#m=0&t=1&c=fks_084071082087086069082 ...
- 10gocm->session5->数据库管理实验->GC资源管理器的资源消耗组介绍
<GC资源管理器> 官方文件:administrator's Guide->24 Using the Database Resource Manager 用法:在实际生产环境中使用 ...
- Windows中查看进程的资源消耗(cpu, Disk,Memory,NetWork)
1.通过Windows Task Manager 的 Performance Tab 可以看到总体的性能消耗情况. 2.如果想看系统中每个进程的资源消耗,可以点击 下面的 Open Resource ...
- HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用
注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性).HashSet实际上为(key.null)类型的Has ...
- 云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 (阿里云ECS服务器 )课堂
云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 1. 开通云服务器 2 1.包年包月 按量付费(适合测试数据的时候) 2 2.地域 服务器数 ...
- javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
随机推荐
- WinDbg-如何抓取dump文件
这要分两种情况:第一种情况:如果是Vista或者是Windows2008操作系统就是一个简单的事情,在任务管理器中,切换到"进程"选项卡,右键点击你想要创建dump文件的进程,然后 ...
- Tiny microcontroller hosts dual dc/dc-boost converters
Batteries are the typical power sources for portable-system applications, and it is not unusual thes ...
- python爬虫beautifulsoup4系列4-子节点
前言 很多时候我们无法直接定位到某个元素,我们可以先定位它的父元素,通过父元素来找子元素就比较容易 一.子节点 1.以博客园首页的摘要为例:<div class="c_b_p_desc ...
- 自定义ListView adapter适配器
转自:http://hilary3113.iteye.com/blog/998352 listview加载adapter过程是这样的. 1 先判断adapter 有多少数据项,根据这个数据确定有多少i ...
- gpu和cpu区别
GPU的功耗远远超过CPUCache, local memory: CPU > GPU Threads(线程数): GPU > CPURegisters: GPU > CPU 多寄存 ...
- (Inside Out) Web地图坐标系——TDT的奇妙
一个GIS科班出生的研究生.把已还到课本的基础GIS知识,准备又一次学习,并结合这几年下来自身在行业中GIS的应用.总结一些有用的GIS知识点.一备不时之需,二为积累沉淀,三则是年龄越大.记性越差,加 ...
- boost.asio学习笔记一、linux下boost库的安装
欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46761029 学习开源库第一步就是编译安装好库,然后执行成功一个 ...
- Android -- 利用Broadcast开启Service
Broadcast和Service都是Android四大组建之一的. 这里的广播是动态的,自己注册的一个广播. 这种最典型的用法就是利用开机广播,然后再起自己的服务,也就是在Android手机中做到开 ...
- scala lambda 小括号与大括号
看akka源码的时候看到这样的一个用法: 作为接触scala两天半的我有些看不明白了.好一番搜索看到这样的答案: <scala雾中风景(2): 小括号与花括号> 下面的问题,表面上看是小括 ...
- 在 WF 4 中编写自定义控制流活动
在 WF 4 中编写自定义控制流活动 Leon Welicki 控制流是指组织和执行程序中各个指令的方法. 在 Windows Workflow Foundation 4 (WF 4) 中,控制流活动 ...