我想对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.
请帮助我,谢谢!
答案 0 :(得分:10)
我使用类似上面的代码得到了完全相同的错误。我发现将QOS更改为0可以解决问题。
message.setQos(0);
[编辑]再挖掘一下,我发现RabbitMQ的MQTT插件不支持2的QOS。http://www.rabbitmq.com/mqtt.html
答案 1 :(得分:3)
我的问题是由于clientId与发布者/订阅者相同。 Persistence数据存储区的错误也在使用中。
答案 2 :(得分:0)
Linux中有1024个文件/套接字限制,但您可以对其进行扰乱,ulimit -n 4096
请参阅:
mqtt mosquitto linux connection limit
答案 3 :(得分:0)
在我的情况下,这是因为我不小心使用了tcp://...
网址而不是ssl://...
,并且服务器配置为不允许不安全的连接。
我还必须这样做,因为@Aidan说并将QoS从2降低到1。
修改:我不是100%肯定,但我认为我使用的服务器是RabbitMQ,并且分配了non-standard meaning to the QoS values。说实话,这可能是一个更明智的意义:
瞬态(QoS0)订阅使用非持久的自动删除队列 将在客户端断开连接时被删除。
持久(QoS1)订阅使用持久队列。是否排队 自动删除是由客户端的干净会话标志控制的。 具有干净会话的客户端使用自动删除的队列,其他人使用 非自动删除的。
答案 4 :(得分:0)
客户端ID是问题,生成随机测试
MqttClient.generateClientId ();
答案 5 :(得分:0)
有时,当您尝试发送大型数据集时会发生这种情况。尝试减少数据集大小。它解决了我的问题。
答案 6 :(得分: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中遇到了这个问题,这是我的解决方案。