对emqttd做benchmark的时候遇到的几个坑
来源:互联网 发布:c语言网络编程 编辑:程序博客网 时间:2024/05/22 10:59
为了测试emqttd在我们的刀片机上面的性能,我们做了一次benchmark,遇到了几个有意思的问题
使用emqttc全力发送pub反而吞吐下降了
官方使用emqttc做了一个benchmark工具,其中有一个pub端,可以起n个连接,每隔m毫秒发送一个数据包。其实现隔时间发送publish的功能,是通过erlang的time模块每隔一定时间就往发送者线程发送一个publish消息实现的。发送者线程收到publish,就调用一次emqttc的publish,进行一次发消息操作。为了解除publish的最小1ms的限制,我去掉了time模块的调用(因为time的send interval调用最小的时间间隙就是1ms),改而使用调用了emqttc的publish之后,马上发一个publish消息给自己,这样本地马上又会再收到publish消息,马上发下一次的消息。
然而,之前1ms一个publish,接收方收到的数据的速度还能达到1000 msg/s,但是我放开1ms的限制之后,接收端收到的数据反而下降了,减少到了200 msg/s。仔细观察了tcp链路的包,并不忙碌。最后定位到问题,实际是因为erlang在调度的时候,发送者线程一直收到publish请求,一直在调用emqttc的publish,但是一直给自己发消息,导致了发送者线程一直占用cpu,而没有给发送者cpu,发送者实际发出的包反而少了
局域网内的机器ops起不来
我们在emqttd的运行机器上,跑benchmark,基本他的扇出可以达到10w msg/s,但是当我们在局域网的其他机器上跑客户端,就怎么都跑出这个效果。一开始考虑到可能是客户端的cpu压力过大(我们跑了10个发送者,50个接收者),于是我们分散了一下客户端。然而,发送者还是不能把所有请求下发给客户端。为了算清楚瓶颈具体在哪里,我们做了简单的计算。我们用的benchmark工具还是每个连接,每秒发送1k消息。10个发送者,一秒pub 1w条消息。50个sub,一秒扇出就高达50w。计算下来,似乎远高于本地benchmak结果,于是我们只好换其他方法测试了。
我们修改了测试模型。
我们先做了一个pub,一个sub的情况,hmm,因为benchmark工具的原因,似乎跑不出压力,只能跑到1k msg/s。于是我们换了benchmark工具,该工具纯粹发送消息,不做接收。但是似乎也不太对,只跑到了2k msg/s的发送。压力仍旧没有打满
我们又做了多个pub,一个sub,的测试。pub端每个连接都是1k msg/s,然而跑到17k/s,也到极限了,跟本地的10w/s相差还是比较大。看来也不行。
一个pub,每秒1000msg,然后我们在一个机器上起了30个client,嗯,很稳定。然后我们逐渐增加,就开始出现抖动了。不对,也还是3w msg/s的扇出而已。于是我们起了另一个机器,继续sub,发现新的机器的下发是稳定。于是我们在新的机器也起了20多个sub端,之后也开始出现了抖动。这个时候,服务器仍旧没有压力。所以看起来瓶颈不在服务器,而是客户端。仔细查看之后,我们发现,实际就是机器网卡的带宽被打满了,不能hold住继续增加的流量。
于是我们找到了一台能hold住更多流量的机器,然而,当客户端跑到40个的时候,也开始hold不住了。这个时候流量比之前多了一倍,但是那个机器的网卡带宽是之前的10倍,所以还是不对,仔细检查,是客户端的cpu被打满。好吧,我们只能增加机器。
最后的最后,通过一个pub,多个sub的方法,我们把机器的性能压榨到一个比较极限的情况,证明在我们的配置下,这个设备至少能扇出27w msg/s。虽然因为我们手头客户端数量的问题,这个压力还不是最大压力就是了。
阅读全文
0 0
- 对emqttd做benchmark的时候遇到的几个坑
- emqttd 使用 SSL遇到的问题
- 几个重要的OpenMP benchmark
- 关于 Benchmark 的几个思考
- 做WebView的时候遇到的错误
- 使用MYSQL benchmark - DBT2 Benchmark Tool遇到的问题
- emqttd--------mqttd-benchmark-------Erlang安装
- High Performance MySQL作者对TokyoTyrant做的性能测试(benchmark)
- 自已做了个浏览器的benchmark
- 用BC命令做简单的benchmark
- 初学Opencv时候遇到的几个编译器报错问题
- 在使用Spring的事务注解@Transactional的时候遇到几个坑
- discuz做整合的时候遇到的“ Illegal request”解决办法
- 做Android游戏开发的时候遇到的一些问题
- 用div做页面的时候遇到的问题
- 在做App上线打包的时候遇到的问题
- 自己做项目的时候遇到的一些简单问题
- 夜间模式demo做的时候遇到的一些问题
- Python学习 第一天任务 (四:【基于Python编程从入门到实践】动手试一试)
- 51nod 1097 拼成最小的数
- 【操作系统】Main Memory
- python 逻辑回归
- Redis简介(三)面试常见问题
- 对emqttd做benchmark的时候遇到的几个坑
- Flask学习笔记
- 可用的linux源
- 【我的Java笔记】网络编程
- Mac上python2和python3的版本切换的简单处理方式
- 【温故知新】BZOJ复习计划
- 函数调用过程,栈帧的创建和销毁
- XCode下Object C和C++混合编译
- #define 定义 宏