问题描述
我们测试环境对emqx进行压测,数量2w个连接,连接速率约每秒400个,一段时间后,压测程序停止。dashboard上客户端列表数量并未减少并且也踢不掉,踢掉时emqx响应超时。打开emqx remote_console看,MsgQ 积压了5k条并且数量没变化。后续启动压测程序,也无法连接。从整体看,emqx等于宕机。
emqx 接入了java hook,java hook 逻辑就是在客户端上下线对redis进行写操作。
为了减少对redis写的频次,在onClientConnected 和onClientDisconnected方法内,把事件插到全局的LinkedBlockingQueue。启一个worker 线程,每500ms,从LinkedBlockingQueue通过drainTo方法,把元素移到新的List,然后for循环处理。LinkedBlockingQueue是线程安全的,按道理说应该不会有问题的。
退一步讲,就算worker线程有异常,也不会影响也不应该影响到onClientConnected方法,何况这方法是void 返回。我还特地看了下内存情况,都是很正常的。LinkedBlockingQueue 长度我也没有做限制。
那么问题在哪呢?如何优化?
erlang 是如何调用java hook的呢 ?机制是什么?有什么限制?
PS: 后来我取消了worker线程和LinkedBlockingQueue,改成了直接在方法内调用redis相关方法,情况可以改善(测试时间不够长),直到有个同事修改了clientId为字符串,导致代码中的Long.parseLong方法抛出异常(多次),居然也导致了emqx 挂掉。
环境信息
- EMQ X 版本:4.2.8
- 操作系统及版本:ubuntu20.04
- 其他 java hook 运行环境采用jdk1.8
相应的配置文件内容
详细日志
![微信图片_20210322221210|690x252](upload://lKTifcUZh28fRwBFkIxOOy6duc2.jpeg)