eMQTT-Bench
— это лёгкий инструмент для тестирования протокола MQTT версии 5.0, написанный на языке Erlang.
Вы можете скачать готовые бинарные пакеты по ссылке: https://github.com/emqx/emqtt-bench/releases.
Примечание: для сборки требуется Erlang/OTP 22.3 или более поздней версии.
Для работы emqtt-bench
требуется установить библиотеку libatomic
.
# centos 7
sudo yum install libatomic
# ubuntu 20.04
sudo apt install libatomic1
git clone https://github.com/emqx/emqtt-bench.git
cd emqtt-bench
make
Если у вас возникли проблемы с компиляцией, вы можете отключить поддержку QUIC:
BUILD_WITHOUT_QUIC=1 make
$ ./emqtt_bench conn --help
``` **Процессы тестирования.** Значение 0 означает отключение (по умолчанию). Это действует только при использовании вместе с --lowmem. [По умолчанию: 0]
**--log_to** — управляет выводом логов. console: непосредственно в консоль, null: тихо, не выводить логи. [По умолчанию: console]
**--prometheus** — включает сбор метрик через Prometheus. Обычно используется с --restapi для включения конечной точки очистки.
**--restapi** — включает REST API для мониторинга и управления. Сейчас обслуживает только /metrics. Может быть установлен на IP:Port для прослушивания на определённом IP и порту или просто на порт для прослушивания на всех интерфейсах этого порта. [По умолчанию: отключено]
Например, создайте 50 000 одновременных подключений со скоростью поступления 100/сек:
```sh
./emqtt_bench conn -c 50000 -i 10
$ ./emqtt_bench sub --help
Использование: emqtt_bench под [--help <помощь>] [-d <порт распределения>] [-h [<хост>]] [-p [<порт>]] [-V [<версия>]] [-c [<количество>]]
[-n [<начальный номер>]] [-i [<интервал>]] [-t <тема>] [--payload-hdrs [<заголовки полезной нагрузки>]] [-q [<качество обслуживания>]]
[-Q [<качество опыта>]] [-u <имя пользователя>] [-P <пароль>] [-k [<время поддержания соединения>]] [-C [<очистка>]] [-x [<срок действия>]]
[-S [<SSL>]] [--cacertfile <файл сертификата CA>] [--certfile <сертификат>] [--keyfile <закрытый ключ>]
[--ws [<WS>]] [--quic [<QUIC>]]
[--load-qst <nst_dets_file>] [--ifaddr <ifaddr>] [--prefix <префикс>] [-s [<короткие идентификаторы>]] [-l <lowmem>]
[--num-retry-connect [<число повторных попыток подключения>]] [-R [<скорость соединения>]]
[--force-major-gc-interval [<интервал принудительного основного GC>]] [--log_to [<log_to>]]
[--prometheus]
[--restapi <ip>:<port> | <port>]
--help справочная информация
-d, --dist включить порт распределения
-h, --host имя хоста сервера MQTT или имена хостов через запятую [по умолчанию: localhost]
-p, --port номер порта сервера MQTT [по умолчанию: 1883]
-V, --version протокол MQTT версии: 3 | 4 | 5 [по умолчанию: 5]
-c, --count максимальное количество клиентов [по умолчанию: 200]
-n, --startnumber начальная точка при назначении порядковых номеров клиентам. Это полезно при запуске нескольких экземпляров emqtt-bench для тестирования одного и того же брокера (кластера), поэтому начальное число можно запланировать, чтобы избежать коллизии идентификаторов клиентов [по умолчанию: 0]
-i, --interval интервал подключения к брокеру [по умолчанию: 10]
-t, --topic подписка на тему, поддержка переменных %u, %c, %i
--payload-hdrs обработка заголовка полезной нагрузки полученного сообщения. На стороне публикации должна быть включена та же опция в том же порядке. cnt64: проверка строгого увеличения счётчика. ts: подсчёт задержки публикации. [по умолчанию: ]
-q, --qos подписаться на качество обслуживания [по умолчанию: 0]
-Q, --qoe включить отслеживание качества опыта [по умолчанию: false]
-u, --username имя пользователя для подключения к серверу
-P, --password пароль для подключения к серверу
-k, --keepalive поддерживать соединение в секундах [по умолчанию: 300]
-C, --clean чистый старт [по умолчанию: true]
-x, --session-expiry установить «Session-Expiry» для постоянных сеансов (секунды) [по умолчанию: 0]
-S, --ssl сокет SSL для подключения к серверу [по умолчанию: false]
--cacertfile сертификат CA для проверки сервера
--certfile сертификат клиента для аутентификации, если требуется сервером
--keyfile закрытый ключ клиента для аутентификации, если требуется сервером
--ws
*Примечание: в ответе сохранены оригинальное форматирование текста и спецсимволы.* **websocket transport [default: false]**
* --quic QUIC transport [default: false]
* --load-qst load quic session tickets from dets file
* --ifaddr local ipaddress или interface address
* --prefix Client ID prefix. Если не указано, используется '$HOST_bench_(pub|sub)_$RANDOM_$N', где $HOST — это имя хоста или IP-адрес, указанный в опции --ifaddr, $RANDOM — случайное число, а $N — порядковый номер, присвоенный каждому клиенту. Если указано, суффикс $RANDOM добавляться не будет.
* -s, --shortids использовать короткие идентификаторы клиентов. Если указан --prefix, добавляется префикс, иначе идентификатор клиента — это присвоенный порядковый номер. [по умолчанию: false]
* -l, --lowmem включить режим низкой памяти, но использовать больше CPU
* --num-retry-connect количество попыток установить соединение перед отказом [по умолчанию: 0]
* -R, --connrate скорость соединения (/с), по умолчанию: 0, при необходимости использовать --interval [по умолчанию: 0]
* --force-major-gc-interval интервал в миллисекундах, через который на процессах стенда будет принудительно выполняться полный сборщик мусора. Значение 0 означает отключено (по умолчанию). Это действует только при использовании вместе с --lowmem. [по умолчанию: 0]
* --log_to управление выводом логов. console: непосредственно в консоль null: тихо, не выводить логи. [по умолчанию: console]
* --prometheus включить сбор метрик через Prometheus. Обычно используется с --restapi для включения очистки конечной точки.
* --restapi включить REST API для мониторинга и управления. Сейчас обслуживает только /metrics. Можно задать IP:Port для прослушивания на определённом IP и порту или просто Port для прослушивания на всех интерфейсах этого порта. [отключено по умолчанию]
**Например, создайте 50 тыс. одновременных подключений со скоростью поступления 100/сек:**
```sh
./emqtt_bench sub -c 50000 -i 10 -t bench/%i -q 2
Usage: emqtt_bench pub [--help <help>] [-d <dist>] [-h [<host>]] [-p [<port>]] [-V [<version>]] [-c [<count>]]
[-n [<startnumber>]] [-i [<interval>]] [-I [<interval_of_msg>]] [-u <username>] [-P <password>]
[-t <topic>] [--payload-hdrs [<payload_hdrs>]] [-s [<size>]] [-m <message>] [-q [<qos>]]
[-Q [<qoe>]] [-r [<retain>]] [-k [<keepalive>]] [-C [<clean>]] [-x [<expiry>]] [-L [<limit>]]
[-S [<ssl>]] [--cacertfile <cacertfile>] [--certfile <certfile>] [--keyfile <keyfile>]
[--ws [<ws>]] [--quic [<quic>]]
[--load-qst <nst_dets_file>] [--ifaddr <ifaddr>] [--prefix <prefix>] [-s [<shortids>]] [-l <lowmem>]
[-F [<inflight>]] [-w [<wait_before_publishing>]] [--max-random-wait [<max_random_wait>]]
[--min-random-wait [<min_random_wait>]] [--num-retry-connect [<num_retry_connect>]]
[-R [<conn_rate>]] [--force-major-gc-interval [<force_major_gc_interval>]] [--log_to [<log_to>]]
[--prometheus]
[--restapi <ip>:<port> | <port>]
--help help information
-d, --dist enable distribution port
-h, --host mqtt server hostname or comma-separated hostnames [default: localhost]
-p, --port mqtt server port number [default: 1883]
-V, --version mqtt protocol version: 3 | 4 | 5 [default: 5]
-c, --count max count of clients [default: 200]
-n, --startnumber The start point when assigning sequence numbers to clients. This is useful when running
multiple emqtt-bench
...
[остальные строки исходного текста оставлены без перевода] **instances to test the same broker (cluster), so the start number can be planned to avoid client ID collision [default: 0]**
-i, --interval интервал подключения к брокеру [по умолчанию: 10]
-I, --interval_of_msg интервал публикации сообщения (мс) [по умолчанию: 1000]
-u, --username имя пользователя для подключения к серверу
-P, --password пароль для подключения к серверу
-t, --topic тема подписки, поддержка переменных %u, %c, %i, %s
--payload-hdrs если установлено, добавьте дополнительные заголовки полезной нагрузки. cnt64: строго увеличивающийся счётчик (64 бита) на издателя ts: отметка времени при излучении примера: --payload-hdrs cnt64,ts [по умолчанию:]
-s, --size размер полезной нагрузки [по умолчанию: 256]
-m, --message задайте содержимое сообщения для публикации
-q, --qos подписка QoS [по умолчанию: 0]
-Q, --qoe включить отслеживание QoE [по умолчанию: false]
-r, --retain сохранить сообщение [по умолчанию: false]
-k, --keepalive поддерживать в рабочем состоянии в секундах [по умолчанию: 300]
-C, --clean очистить начало [по умолчанию: true]
-x, --session-expiry установить «Session-Expiry» для постоянных сеансов (секунды) [по умолчанию: 0]
-L, --limit максимальное количество сообщений для публикации, 0 означает неограниченное [по умолчанию: 0]
-S, --ssl SSL-сокет для подключения к серверу [по умолчанию: false]
--cacertfile сертификат CA для проверки сервера
--certfile клиентский сертификат для аутентификации, если требуется сервером
--keyfile клиентский закрытый ключ для аутентификации, если требуется сервером
--ws веб-транспорт [по умолчанию: false]
--quic транспорт QUIC [по умолчанию: false]
--load-qst загрузить билеты сеанса quic из файла dets
--ifaddr один или несколько (через запятую) исходных IP-адресов
--prefix префикс клиентского ID. Если не указано, используется '$HOST_bench_(pub|sub)_$RANDOM_$N', где $HOST — это либо имя хоста, либо IP-адрес, указанный в опции --ifaddr, $RANDOM — случайное число, а $N — порядковый номер, назначенный каждому клиенту. Если указано, суффикс $RANDOM добавляться не будет.
-s, --shortids использовать короткие клиентские ID. Если указан --prefix, добавляется префикс, иначе клиентским ID является присвоенный порядковый номер. [по умолчанию: false]
-l, --lowmem включить режим низкой памяти, но использовать больше ЦП
-F, --inflight максимальное количество сообщений в пути для QoS 1 и 2, значение 0 для «бесконечности» [по умолчанию: 1]
-w, --wait-before-publishing дождитесь, пока все издатели подключатся, прежде чем начать публикацию [по умолчанию: false]
--max-random-wait максимальный случайный период в мс, который каждый издатель будет ждать перед началом публикации (равномерное распределение) [по умолчанию: 0]
--min-random-wait минимальный случайный период в мс, который каждый издатель будет ждать перед началом публикации (равномерное распределение) [по умолчанию: 0]
--num-retry-connect количество попыток установления соединения перед отказом [по умолчанию: 0]
-R, --connrate скорость соединения (/с), по умолчанию: 0, при необходимости использовать --interval [по умолчанию: 0]
--force-major-gc-interval интервал в миллисекундах, в котором на процессах стенда будет принудительно выполняться полный сборщик мусора. Значение 0 означает отключено (по умолчанию). Это действует только при использовании вместе с --lowmem. [по умолчанию: 0]
--log_to управление тем, куда направляется вывод журнала. console: непосредственно на консоль null: тихо, не выводить журналы. **--prometheus**
Включить сбор метрик через Prometheus. Обычно используется с --restapi для включения конечной точки очистки.
**--restapi**
Включить REST API для мониторинга и управления. На данный момент обслуживает только /metrics. Можно задать IP:Port, чтобы слушать на определённом IP и порту, или просто порт, чтобы слушать во всех интерфейсах на этом порту. По умолчанию отключено.
Например, создайте 100 соединений, каждое из которых публикует сообщения со скоростью 100 сообщений в секунду.
```sh
./emqtt_bench pub -c 100 -I 10 -t bench/%i -s 256
./emqtt_bench pub --ifaddr 192.168.1.10
./emqtt_bench sub --ifaddr 192.168.2.10
./emqtt_bench sub -c 100 -i 10 -t bench/%i -p 8883 --ssl
./emqtt_bench pub -c 100 -I 10 -t bench/%i -p 8883 -s 256 --ssl
./emqtt_bench sub -c 100 -i 10 -t bench/%i -p 8883 --ssl --certfile путь/к/client-cert.pem --keyfile путь/к/client-key.pem
./emqtt_bench pub -c 100 -i 10 -t bench/%i -s 256 -p 8883 --ssl --certfile путь/к/client-cert.pem --keyfile путь/к/client-key.pem
Не следует устанавливать параметр '-c' более 64K для ограничения портов TCP на одном исходном адресе, однако вы можете отправлять сообщения с нескольких исходных IP-адресов с помощью '--ifaddr', например:
./emqtt_bench sub -c 200000 -t "perf/test" --ifaddr 192.168.200.18,192.168.200.19,192.168.200.20,192.168.200.21
Обязательно увеличьте лимиты использования ресурсов и расширьте диапазон портов, как показано ниже, в Linux.
ulimit -n 200000
sudo sysctl -w net.ipv4.ip_local_port_range="1025 65534"
Команда EMQX.
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.