性能测试发现 性能达不到官网所说

EMQX 版本

EMQX 4.3.8

EMQX 安装部署方式

window zip解压

EMQX 集群情况

未使用集群,仅单节点

服务器(运行 EMQX 的机器)硬件配置

16核 40GB CPU 型号:Intel(R) Xeon(R) E-2278GE CPU @3.30GHz

服务器操作系统和平台

Windows

服务端参数优化情况

使用默认配置

压力机硬件配置

6核 32GB CPU 型号:Intel(R) Core™ i7-8750H CPU @2.20GHz

压力机使用的测试工具

mqttx-cli-win-x64

压力机参数优化情况

没设置

在 EMQX 中启用的功能

没用启用

测试场景

连接测试:一台压力机,每50毫秒的速度建立一万个连接。
消息发送和接收测试: 一台压力机,修改链接数和发送时间间隔,测试最大发送速率

具体问题

1、连接数设为1万,导致emqx 死机,必须重启。日志:
State machine <0.26313.15> terminating. Reason: system_limit. Stack: [{gen_statem,loop_state_callback_result,11,[{file,“gen_statem.erl”},{line,1360}]},{proc_lib,init_p_do_apply,3,[{file,“proc_lib.erl”},{line,226}]}]. Last event: {info,{inet_async,#Port<0.12>,8286,{error,system_limit}}}. State: {accepting,{state,‘mqtt:tcp’,{{0,0,0,0},1883},#Port<0.12>,inet_tcp,{{0,0,0,0},1883},{fun esockd_listener_sup:tune_socket/2,[[{tune_buffer,false}]]},,{listener,‘mqtt:tcp’,{{0,0,0,0},1883}},<0.485.0>,8286}}.
2023-11-09T11:14:12.275000+08:00 [error] crasher: initial call: esockd_acceptor:init/1, pid: <0.26313.15>, registered_name: , exit: {system_limit,[{gen_statem,loop_state_callback_result,11,[{file,“gen_statem.erl”},{line,1360}]},{proc_lib,init_p_do_apply,3,[{file,“proc_lib.erl”},{line,226}]}]}, ancestors: [<0.486.0>,<0.484.0>,esockd_sup,<0.159.0>], message_queue_len: 0, messages: , links: [<0.486.0>], dictionary: [{rand_seed,{#{jump => #Fun<rand.3.47293030>,max => 288230376151711743,next => #Fun<rand.5.47293030>,type => exsplus},[213986890727947748|3240440717214547]}}], trap_exit: false, status: running, heap_size: 6772, stack_size: 28, reductions: 8815; neighbours:
2023-11-09T11:14:12.275000+08:00 [error] Supervisor: {<0.486.0>,esockd_acceptor_sup}. Context: child_terminated. Reason: system_limit. Offender: id=acceptor,pid=<0.26313.15>.
2023-11-09T11:14:12.284000+08:00 [error] State machine <0.26314.15> terminating. Reason: system_limit. Stack: [{gen_statem,loop_state_callback_result,11,[{file,“gen_statem.erl”},{line,1360}]},{proc_lib,init_p_do_apply,3,[{file,“proc_lib.erl”},{line,226}]}]. Last event: {info,{inet_async,#Port<0.12>,8287,{error,system_limit}}}. State: {accepting,{state,‘mqtt:tcp’,{{0,0,0,0},1883},#Port<0.12>,inet_tcp,{{0,0,0,0},1883},{fun esockd_listener_sup:tune_socket/2,[[{tune_buffer,false}]]},,{listener,‘mqtt:tcp’,{{0,0,0,0},1883}},<0.485.0>,8287}}.

2、当发送速率在一万左右时, 报错:Error: Publish error: Receive Maximum exceeded;
日志:] Dropped the qos2 packet 64385 due to awaiting_rel is full.
注:接收端也是用mqttx-cli 。

  1. system_limit 错误可能是进程数的限制,注意 etc/vm.args 里的 +P 和 +Q 参数,默认应该是:
+P 2097152
+Q 1048576

你检查一下看对不对。

另外不要在生产环境中用 emqx for Windows,因为并不稳定,建议使用容器或者 linux 环境。

  1. QoS2 的问题是客户端的 PUBREL 没过来,可能是客户端的处理能力问题。你可以使用 emqtt_bench 做测试,连接数 1000 个或 10000 个,每个连接每秒 10 个消息或 1 个消息。测试时注意看系统的 CPU 使用率。

你好,我改用docker 来部署emqx ,测试发送消息速率,有个输出为:
1m18s pub_overrun total=68 rate=1.14/sec
这个表示什么意思,是因为消息投递后消费者能力不足再次投递吗。

pub_overrun 可以这样理解:

实际发布速率达不到给定的发布速率参数。
即:按照给定的 publish 速率及总体消息条数,下一条消息应该发布的时间点已经错过。
在发布过程中,一段时间内需要发出的消息条数 NeedPub (按照给定的pub速率计算),和当前已经发出的消息条数 HavePubed 关系为 HavePubed < NeedPub

具体原因多种多样::one:可能为 qos1/qos2 消息在 recv 段消费不及时无法回复 puback/pubrecv,:two:网络原因,:three:机器硬件性能不足……

但最常见的还是原因:one:

请问楼主问题1是如何解决的呢