通过连接100,000个客户来测试MQTT经纪人

时间:2018-09-10 13:50:58

标签: linux multithreading mqtt emq mqtt-vernemq

我从事MQTT协议研究已经有一段时间了。该协议将被组织用于分别向每个客户端发送确认消息。

在用例中,只有1个“发布者”客户端将确认消息发布给订阅了其唯一主题的“订阅者”客户端

为了确保该代理在很大程度上没有错误并且可以在将来轻松扩展,我一直在尝试通过尝试将至少50,000个客户端连接到它们来测试Emqx和Vernemq开源代理。

但是,我无法创建那么多连接。我的Ubuntu 18.04  大约300-400之后,Google云端实例上的实例(8核CPU,15 GB RAM)无法成功建立连接。

我尝试进行以下更改: ulimit -n 64500(用于允许这么多文件描述符,因为每个套接字连接都需要一个文件描述符)

请帮助我建立超过50,000个连接。我应该在每个线程上运行n个线程并在循环下运行total_clients / total_threads个客户端吗?

还是应该为每个客户端连接创建一个线程?

我该怎么办?

即使客户端没有发送断开数据包,一旦客户端开始断开连接,以下消息也会出现在“ $ SYS /#”主题上。 $SYS/brokers/emqx@127.0.0.1/clients/112/disconnected {“ clientid”:“ 112”,“ username”:“ undefined”,“ reason”:“ closed”,“ ts”:1536587647}

import paho.mqtt.client as mqtt
from threading import Lock
import time



print_lock = Lock()
def s_print(str):
    print_lock.acquire()
    print(str)
    print_lock.release()


def on_connect(client, userdata, flags, rc):
    client_id = userdata["client_id"]
    if (rc == 0):
        s_print("connected " + client_id)
        client.subscribe(client_id, 2)

def on_disconnect(client, userdata, rc):
        client_id = userdata["client_id"]
        s_print("disconnected: " + client_id + " reason " + str(rc))



def on_message(client, userdata, message):
    topic = message.topic
    payload = str(message.payload)
    s_print("Recieved " + payload + " on " + topic)


if __name__ == '__main__':
    n_clients = int(input("Enter no. of clients:    "))

    for i in range(n_clients):
        client_id = str(i)
        s_print(client_id)
        userdata = {
                "client_id"  : client_id
            }

        client = mqtt.Client(client_id=client_id, clean_session=True, userdata=userdata)
        client.on_connect  = on_connect
        client.on_disconnect =on_disconnect
        client.on_message = on_message
        client.connect("35.228.57.228", 1883, 60)
        client.loop_start()    
        time.sleep(0.5)    

while(1):
    time.sleep(5)

0 个答案:

没有答案