Credits:The XMQ web site is provided by Linotex.The XMQ and SPTK Windows installers are created with Advanced Installer free Open-Source license.
There were 0 unique visitors to this page

MQTT Performance Tests: Message Persistence

Persistent Point-to-Point: Durable Delivery

This test repeats one-to-one delivery with persistent sessions, each broker with the persistence it offers, so queued messages can survive a broker restart. The measured rate and latency show the cost of that durability; what a failure can still lose depends on the broker and its configuration - for XMQ see Persistence.

The scenario is point-to-point, the same shape as the in-memory point-to-point page: each publisher has its own subscriber on its own topic, so the broker does no fan-out and what is measured is the per-message cost of routing plus the cost of persisting it. Both client groups connect with clean_session off, so a run at 60K holds 120,000 persistent sessions. Each publisher sends one message per second with a 16-byte payload, and every broker starts against empty storage.

This configuration answers a particular need, and is not the one most deployments want. Persistence earns its cost where a message that never arrives is worse than a message that arrives late: commands to equipment that is intermittently connected, orders and transactions, anything a subscriber must receive even if it was offline when the message was sent, or if the broker restarted between the two. For live telemetry, metrics and status streams — where the next reading supersedes the last and a gap costs nothing — persistence buys nothing, and the in-memory figures on the other test pages are the ones that apply.

It is worth setting the numbers below against that. Workloads that genuinely need durable delivery are usually counted in messages per device per minute rather than per second, so the rates measured here are well clear of what they ask for. The ceiling matters when durable and high-volume traffic share one broker, and the two can be separated: only sessions connecting with clean_session off and messages sent at QoS 1 or above pay for persistence at all, so a broker can carry both without the fast traffic paying the durable traffic's cost.

The brokers do not persist the same thing, and that is part of the result.This historical XMQ run used Redis AOF with appendfsync everysec andmax_queued_writes 1000. It used asynchronous write-behind and is closest to today's Persistent mode, but differs because current Persistent mode disables AOF. It is not a measurement of today's Durable mode, which uses appendfsync always and waits for local AOF fsync before successful acknowledgements. HiveMQ uses its file persistence; both store each message. EMQX stores messages with durable sessions enabled. FlashMQ saves its sessions to disk periodically and at shutdown, and Mosquitto saves a snapshot of its in-memory database on an interval — so a crash loses what arrived since the last save, and their figures are those of in-memory delivery. Each broker's settings are recorded with its results.

XMQ 1.0.2 and FlashMQ 1.27.2 were re-measured on 2 November 2026 on the same c5n.4xlarge host (16 vCPU, 40 GB) as the other brokers here. Percentiles are shown where the run recorded them; a dash means its result file has no percentile section.

QoS 1, 16B payload, MQTT 5, 10 minutes per scenario unless stated, connect rate 10000/s.

Broker ▲VersionMessagesAchieved rateAvg latencyMedianp99p99.9CPUAvg RAMMedian RAMMax RAM
EMQX6.3.135,793,46459,655/s23.8ms19.8ms——1265% mean / 1464% peak4.84 Gb4.80 Gb5.08 Gb
FlashMQ1.27.236,001,43260,002/s203us203us416us508us248% mean / 273% peak607 Mb607 Mb608 Mb
HiveMQ2026.535,021,29558,368/s9.1s9.3s——1398% mean / 1584% peak18.5 Gb19.0 Gb22.09 Gb
Mosquitto2.1.235,906,43859,844/s843.0ms846.4ms——97% mean / 101% peak635 Mb633 Mb642 Mb
XMQXMQ-1.1.136,001,42060,002/s189.5ms172.2ms——354% mean / 704% peak1.33 Gb1.33 Gb1.34 Gb
EMQX
FlashMQ
HiveMQ
Mosquitto
XMQ

Delivery latency over the test

Average latency per interval, by brokerLatency100us1.0ms10.0ms100.0ms1.0s10s100s0s120s240s360s480selapsed

Broker memory (RSS) over the test

Broker memory (RSS) per intervalMemory (RSS)0 Mb12.5 Gb25 Gb37.5 Gb50 Gb0s120s240s360s480selapsed

Latency uses a logarithmic axis: the brokers differ by several orders of magnitude in this scenario, and a linear axis would flatten the faster ones onto the baseline. Hover the chart for per-interval values.