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 ...
随机推荐
- CentOS 6.9/7通过yum安装指定版本的PostgreSQL
PostgreSQL(10+) 一.安装PostgreSQL // 安装EPEL源 # wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel- ...
- Switching regulator forms constant-current source
Many applications require current sources rather than voltage sources. When you need a high-current ...
- Eclipse寻找JVM(JRE)的顺序机制
http://developer.51cto.com/art/200907/135271.htm Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.本文将简单谈谈Eclips ...
- Go:《Go语言 云动力》
背景 中秋快速的读了一遍<Go语言 云动力>,对Go有一下几点感觉: 在静态类型和动态类型之间取得了非常好的平衡,隐式接口实现会被后续的语言借鉴(希望C#能借鉴一下). 缺乏异常处理机制, ...
- PulsingHalo(自定义涟漪)的使用方法
PulsingHalo的git地址是: https://github.com/shu223/PulsingHalo Objective - C 一丶PulsingHalo的实例化和启动: Pulsin ...
- Latex 语法总结——层次结构
层次结构~~documentclass[a4paper,11pt]{article}\usepackage{CJKutf8}\usepackage[top=1in, bottom=1in, left= ...
- jenkins错误413 Request Entity Too Large<
jenkins-nginx--sonar1/sonar2
- 查找链表中倒数第k个结点
题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNex ...
- 关于TagHelper的那些事情——自定义TagHelper(内嵌TagHelper)
内嵌TagHelper 上一篇文章中提到有时候需要设计一种内嵌的TagHelper,如下: <my name="yy" age="35"> < ...
- #include <NOIP2008 Junior> 双栈排序 ——using namespace wxl;
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...