7

我想对mosquitto进行压力测试,所以我创建了一些代码如下

for (int i = 0; i < 800; i++) {
        final int j = i;
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(j + " : ************");
                try {
                    MqttClient client = new MqttClient("tcp://192.168.88.203", SERVER_CLIENTID_PREFIX + j); 
                    client.connect();

                    MqttMessage message = new MqttMessage((j + ":me").getBytes());
                    message.setQos(2);

                    client.publish(TOPIC_PREFIX + j, message);
                } catch (MqttSecurityException e) {
                    e.printStackTrace();
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
    }

但是,我EOFException在运行期间遇到了一些错误,并且某些客户端断开了连接。我想知道一台mosquitto服务器可以同时发布多少个客户端,如何进行压力测试。谢谢!

详细例外是:

    Connection lost (32109) - java.io.EOFException
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:162)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:250)
    at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:51)
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:121)
    ... 1 more

我从 mosquitto 服务器上找到了一些日志:

1383736170: Socket read error on client Server-82, disconnecting.

请帮助我,谢谢!

4

7 回答 7

12

我使用类似于上面的代码得到了这个完全相同的错误。我发现将 QOS 更改为 0 可以解决问题。

message.setQos(0);

[编辑] 多一点挖掘,我发现 RabbitMQ 的 MQTT 插件不支持 2 的 QOS。http://www.rabbitmq.com/mqtt.html

于 2015-01-28T13:54:51.027 回答
3

我的问题是由于发布者/订阅者的 clientId 相同。持久性数据存储也已在使用中出现错误。

于 2015-11-16T22:43:46.003 回答
2

客户端ID是问题,生成随机测试

MqttClient.generateClientId ();
于 2016-10-03T05:23:29.050 回答
0

linux 中有 1024 个文件/套接字限制,但你可以打乱它,ulimit -n 4096请参阅: mqtt mosquitto linux connection limit

于 2014-07-25T16:46:48.640 回答
0

在我的情况下,这是因为我不小心使用了tcp://...URL 而不是ssl://...服务器被配置为不允许不安全的连接。

我还必须按照@Aidan 所说的将 QoS 从 2 降低到 1。

编辑:我不是 100% 确定,但我认为我使用的服务器是 RabbitMQ,它为QoS 值分配了非标准含义。老实说,这可能是一个更明智的含义:

瞬态 (QoS0) 订阅使用非持久的自动删除队列,当客户端断开连接时将被删除。

持久 (QoS1) 订阅使用持久队列。队列是否自动删除由客户端的干净会话标志控制。具有干净会话的客户端使用自动删除队列,其他客户端使用非自动删除队列。

于 2015-07-27T14:55:17.227 回答
0

有时,当您尝试发送大型数据集时会发生这种情况。尝试减小数据集大小。它解决了我的问题。

于 2017-04-25T13:19:19.440 回答
0

解决方案是添加 MqttClient.generateClientId

MemoryPersistence persistence = new MemoryPersistence()
MqttClient client = new MqttClient("tcp://192.168.88.203",MqttClient.generateClientId(),persistence); 
client.connect();

或者

MqttClient client = new MqttClient("tcp://192.168.88.203", MqttClient.generateClientId+SERVER_CLIENTID_PREFIX)

标识符必须是随机的。我在 scala 中遇到了这个问题,这就是我的解决方案。

于 2018-01-06T16:48:44.140 回答