Loadtesting VerneMQ with vmq_mzbench
You can loadtest VerneMQ with any MQTT-capable loadtesting framework. Our recommendation is to use a framework you are familiar with, with MQTT plugins or scenarios that suit your needs.
While MZBench is currently not actively developed, it is still one of the options you can use vmq_mzbench tool. It is based on Machinezone's very powerful original MZBench system, currently available in a community repository here: MZBench system. MZBench lets you narrow down what hardware specs are needed to meet your performance goals. You can state your requirements for latency percentiles (and much more) in a formal way, and let vmq_mzbench automatically fail, if it can't meet the requirements.
If you have an AWS account, vmq_mzbench can automagically provision worker nodes for you. You can also run it locally, of course.
Please follow the MZBench installation guide
Actually, you don't even have to install vmq_mzbench, if you don't want to. Your scenario file will automatically fetch vmq_mzbench for any test you do. vmq_mzbench runs every test independently, so it has a provisioning step for any test, even if you only run it on a local worker.
To install vmq_mzbench on your computer, go through the following steps:
To provision your tests from this local repository, you'll have to tell the scenario scripts to use rsync. Add this to the scenario file:
If you'd just like the script itself fetch vmq_mzbench, then you can direct it to github:
MZBench recently switched from an Erlang-styled Scenario DSL to a more python-like DSL dubbed BDL (Benchmark Definition Language). Have a look at the BDL examples on Github.
You can familiarize yourself quickly with MZBench's guide on writing loadtest scenarios.
There's not much to learn, just make sure you understand how pools and loops work. Then you can add the vmq_mzbench statement functions to the mix and define actual loadtest scenarios.
Currently vmq_mzbench exposes the following statement functions for use in MQTT scenario files:
random_client_id(State, Meta, I)
: Create a random client Id of length I
fixed_client_id(State, Meta, Name, Id)
: Create a deterministic client Id with schema Name ++ "-" ++ Id
worker_id(State, Meta)
: Get the internal, sequential worker Id
client(State, Meta)
: Get the client Id you set yourself during connection setup with the option {t, client, "client"}
connect(State, Meta, ConnectOpts)
: Connect to the broker with the options given in ConnectOpts
disconnect(State, Meta)
: Disconnect normally
subscribe(State, Meta, Topic, QoS)
: Subscribe to Topic with Quality of Service QoS
unsubscribe(State, Meta, Topic)
: Unubscribe from Topic
publish(State, Meta, Topic, Payload, QoS)
: Publish a message with binary Payload to Topic with QoS
publish(State, Meta, Topic, Payload, QoS, RetainFlag)
: Publish a message with binary Payload to Topic with QoS and RetainFlag
It's easy to add more statement functions to the MQTT worker if needed, get in touch with us.