Apache JMeter, bir MQTT eklentisi eklediğiniz anda MQTT broker'ına yük testi yapabilir: her JMeter thread'i bağlanan, publish eden veya subscribe olan bir MQTT client'ına dönüşür; geri kalanını JMeter'ın timer'ları, listener'ları ve HTML raporu halleder. Ekibiniz JMeter'ı zaten HTTP için kullanıyorsa, MQTT testleriniz için de tek bir araç, tek bir rapor formatı ve tek bir CI job'ı ile devam edebilirsiniz.
Bu rehberde eklentiyi kuruyor, publisher ve subscriber'lardan oluşan bir test plan hazırlıyor, GUI olmadan çalıştırıyor ve sayıların gerçekte neyi ölçtüğünü açıklıyoruz.
MQTT eklentisi seçimi
JMeter'da yerleşik MQTT sampler'ı bulunmaz. En yaygın seçenek emqx/mqtt-jmeter eklentisidir (ilk olarak XMeter tarafından yayımlandı). Dört sampler ekler:
| Sampler | Ne yapar |
|---|---|
| MQTT Connect | Bir bağlantı açar (TCP, SSL, WS veya WSS) ve thread için açık tutar |
| MQTT Pub Sampler | Seçilen QoS, retain bayrağı ve payload ile tek bir topic'e publish eder |
| MQTT Sub Sampler | Subscribe olur ve gelen mesajları bir zaman penceresi ya da mesaj sayısı boyunca örnekler |
| MQTT DisConnect | Thread'in bağlantısını kapatır |
Pub ve Sub sampler'ları, aynı thread'deki Connect sampler'ının açtığı bağlantıyı yeniden kullanır. Henüz bağlantı yoksa hemen başarısız olurlar — raporda görmek istediğiniz de tam olarak budur.
JMeter'ı ve eklentiyi kurun
JMeter bir Java runtime'ı gerektirir (JMeter 5.6 için Java 8 veya üzeri). JMeter'ı indirin, ardından eklentinin jar dosyasını projenin releases sayfasından lib/ext klasörüne kopyalayın:
curl -LO https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.6.3.tgz
tar xzf apache-jmeter-5.6.3.tgz
# en güncel jar'ı https://github.com/emqx/mqtt-jmeter/releases adresinden indirin
cp ~/Downloads/mqtt-xmeter-*.jar apache-jmeter-5.6.3/lib/ext/
apache-jmeter-5.6.3/bin/jmeter # plan'ı hazırlamak için GUI'yi başlatırYeniden başlattıktan sonra bir Thread Group'a sağ tıklayıp Add → Sampler menüsüne girdiğinizde dört MQTT sampler'ı görünür. GUI'yi yalnızca plan'ı hazırlamak ve hata ayıklamak için kullanın; gerçek yükü komut satırından üretin.
Herhangi bir yükten önce host, port ve kimlik bilgilerinin tek bir client ile çalıştığını online MQTT client üzerinden doğrulayın. 500 thread ile yanlış bir şifre, 500 aynı hata üretir ve hiçbir bilgi vermez. Örnekler, hızlı işlevsel kontroller için tasarlanmış paylaşımlı bir endpoint olan broker.connectmq.com adresini kullanır; asıl yük çalıştırması için -Jhost değerini ve kimlik bilgilerini kendi özel broker instance'ınıza yönlendirin.
Test plan'ı oluşturun
Gerçekçi bir telemetri testinde iki client grubu vardır: cihaz verisi gönderen publisher'lar ve bu veriyi tüketen subscriber'lar. Aşağıdaki yapı her publisher'a kendi topic'ini ve kendi subscriber'ını verir (bire bir); böylece fan-out'u değil yönlendirmeyi ölçersiniz:
Test Plan
├── User Defined Variables: HOST, PORT, THREADS, RATE
├── Thread Group "subscribers" threads=${THREADS} ramp-up=30 s
│ ├── MQTT Connect clientId prefix "jm_sub_" + random suffix
│ └── MQTT Sub Sampler topic testmqtt/jmeter/${__threadNum}/data
├── Thread Group "publishers" threads=${THREADS} ramp-up=60 s duration=600 s
│ ├── Once Only Controller
│ │ └── MQTT Connect clientId prefix "jm_pub_" + random suffix
│ └── MQTT Pub Sampler topic testmqtt/jmeter/${__threadNum}/data
│ └── Constant Throughput Timer ${RATE} samples/min, all active threads
├── tearDown Thread Group → MQTT DisConnect
└── Summary Report (GUI debugging only)Sampler sampler önemli ayarlar:
- Değişkenler.
HOSTdeğerini${__P(host,broker.connectmq.com)},PORTdeğerini${__P(port,1883)}olarak tanımlayın, diğerlerini de aynı şekilde.__P, komut satırında-Jile verilen bir property'yi okur, yoksa varsayılan değere döner; böylece tek bir.jmxdosyası tüm ortamlarda işinizi görür. - MQTT Connect. Sunucu
${HOST}(tcp://öneki olmadan), port${PORT}, protokol TCP (ya da 8883 portuyla SSL, 8084 ile WSS), kullanıcı adı ve şifre property'lerden, keep alive cihazlarınızla aynı. Client ID için rastgele son eki etkinleştirin — aynı client ID'ye sahip iki thread birbirini broker'dan düşürür. - Once Only Controller. Publisher thread'i yalnızca ilk iterasyonda bağlanır, ardından Pub sampler'ını döngüde çalıştırır. Bu controller olmazsa her iterasyon yeni bir bağlantı açar ve throughput yerine bağlantı hızını test etmiş olursunuz.
- MQTT Pub Sampler. QoS 1, retain kapalı, payload tipi gerçek mesajlarınız boyutunda "random string with fixed length" (örneğin 256 bayt) ve subscriber'ların gecikmeyi hesaplayabilmesi için "Add timestamp in payload" açık.
- MQTT Sub Sampler. Aynı QoS, "Payload includes timestamp" açık ve örnekleme "number of received messages" ile (örneğin 100). Böylece her örnek bir mesaj grubunu temsil eder ve onların gecikmesini raporlar.
- Constant Throughput Timer. Hedef değer dakika başına örnek sayısıdır. Tüm publisher'lar genelinde saniyede 1.000 mesaj için 60.000 girin ve "all active threads in current thread group" seçin. Yalnızca publish hızını ayarlaması için Pub sampler'ının alt öğesi olarak ekleyin.
${__threadNum}, thread'in kendi grubundaki numarasıdır; yani publisher 17 ile subscriber 17 aynı testmqtt/jmeter/17/data topic'ini paylaşır. Wildcard subscription'lara geçerseniz deseni topic matcher ile kontrol edin.
GUI olmadan çalıştırın ve raporu üretin
GUI modu sonuçları bozar: listener'ları çizmek yük üreticinin CPU'sunu tüketir. Non-GUI modunda çalıştırın, ham örnekleri bir .jtl dosyasına yazın ve sonunda JMeter'ın HTML dashboard'unu üretmesine izin verin:
export MQTT_USER=username MQTT_PASS=password
HEAP="-Xms1g -Xmx4g" apache-jmeter-5.6.3/bin/jmeter -n \
-t mqtt-load.jmx \
-Jhost=broker.connectmq.com -Jport=1883 \
-Juser="$MQTT_USER" -Jpass="$MQTT_PASS" \
-Jthreads=200 -Jrate=60000 \
-l results.jtl -e -o report/-n non-GUI modudur, -l sonuç dosyasını belirtir, -e -o dashboard'u boş bir klasöre üretir. HEAP değişkenini jmeter başlatma script'i okur; her thread tam bir MQTT client'ı taşıdığı için thread sayısını artırdığınızda bu değeri de büyütün.
Listener'lar: hangisi kalsın, hangisi kapansın
| Listener | Ne için | Yük sırasında? |
|---|---|---|
| View Results Tree | Tek bir thread'de hata ayıklama, payload kontrolü | Hayır — kapatın |
| Summary Report / Aggregate Report | Sampler başına hızlı sayılar, hata yüzdesi, throughput | Yalnızca GUI deneme çalışmalarında |
.jtl dosyası + HTML dashboard (-e -o) | Nihai rapor: percentile'lar, zamana göre throughput | Evet |
| Backend Listener (InfluxDB) | Uzun çalışmalarda Grafana'da canlı grafikler | Evet, canlı veri gerekiyorsa |
HTML dashboard sonuçları sampler label'ına göre gruplar; bu yüzden sampler'lara net adlar verin ("Pub QoS1 256B", "Sub batch 100") — label'lar raporunuzun başlıklarıdır.
Sayılar ne anlama geliyor
JMeter her örnek için bir "response time" raporlar, ancak her MQTT sampler'ı farklı bir şey ölçer:
| Sampler | Geçen süre şunu ifade eder | Dikkat edilecekler |
|---|---|---|
| MQTT Connect | CONNECT'ten CONNACK'e kadar (TLS handshake dahil) | Ramp-up sırasında hatalar ve yavaş bağlantılar |
| MQTT Pub Sampler | Mesajı teslim etme süresi; QoS 1/2'de broker onayını bekleme süresi dahildir | Artan süre = broker'dan veya ağdan gelen back-pressure |
| MQTT Sub Sampler | Yapılandırdığınız örnekleme penceresi, teslim gecikmesi değil | Örnek başına alınan mesaj sayısı ve timestamp'lerden hesaplanan gecikme |
En önemli iki değer publish throughput (dashboard'daki saniye başına Pub örneği) ve uçtan uca gecikmedir (Sub sampler'ının timestamp hesabı). Alınan mesajlar gönderilenlerin gerisinde kalıyorsa bir şeyler düşüyor veya kuyruğa giriyordur; kapasite sorunlarını QoS 0 kayıplarından ayırmak için testi QoS 1 ile tekrarlayın. Percentile'lar ve yanıltıcı darboğazlar hakkında daha ayrıntılı bilgi için MQTT benchmark sonuçlarını yorumlama yazısına bakın.
Tam olarak yuvarlak bir thread sayısında ortaya çıkan bağlantı hataları genellikle yük üreticide bir işletim sistemi limitine ya da broker'da bir bağlantı limitine işaret eder — too many connections yazısına bakın ve reason code'u MQTT reason code aracı ile sorgulayın.
Yük üreticiyi ölçeklendirme
Her JMeter thread'i kendi MQTT client'ına sahip bir Java thread'idir; bu nedenle JMeter bağlantı başına Erlang veya Go tabanlı araçlardan daha ağırdır. Pratik sınırlar:
- Yük üreticide
ulimit -ndeğerini artırın ve JMeter'a yeterli heap verin. - Üreticinin CPU'sunu izleyin. Yaklaşık %80'in üzerinde ölçümleriniz broker'ı değil JMeter'ı anlatır.
- Daha fazla bağlantı için JMeter'ın dağıtık modunu (
-R host1,host2) kullanarak aynı plan'ı birden çok makinede çalıştırın ya da saf bağlantı testini emqtt-bench aracına taşıyıp JMeter'ı senaryo testlerine ayırın. - Eklentinin 2.x sürümleri, thread başına birden çok bağlantı açan toplu connect/disconnect sampler'ları getirir; thread sayısını azaltmanız gerekiyorsa sürüm notlarına bakın.
Tekrarlanabilir bir JMeter akışı
- Tek bir bağlantıyı online client üzerinden elle doğrulayın.
- Plan'ı GUI'de 2 thread ve açık View Results Tree ile çalıştırın; tüm sampler'ların başarılı olduğunu görün.
- View Results Tree'yi kapatın, kaydedin ve beklenen zirve yükün %10, %50, %100 ve %150'si ile GUI olmadan çalıştırın.
- Her çalışmanın
.jtldosyalarını ve dashboard'larını broker'ın CPU, bellek ve bağlantı metrikleriyle birlikte saklayın. .jmxdosyasını repository'nize commit edin ve her broker güncellemesinden sonra yeniden çalıştırın.
JMeter test trafiğinizi canlı izleyin
JMeter en hafif MQTT yük üretici değildir, ama ekibiniz onu zaten tanıyorsa oldukça pratiktir: parametrik plan'lar, kesin mesaj hızları için timer'lar ve hazır bir HTML raporu. Sampler'ları basit tutun, GUI olmadan çalıştırın ve her sampler'ın süresini gerçekte ölçtüğü şey olarak okuyun.
Sıkça sorulan sorular
JMeter MQTT'yi kutudan çıktığı gibi destekliyor mu?
Hayır. JMeter'da yerleşik bir MQTT sampler'ı yoktur. Connect, Pub, Sub ve DisConnect sampler'larını getiren emqx/mqtt-jmeter (eski adıyla XMeter) gibi bir eklenti eklemeniz gerekir. Jar dosyasını lib/ext klasörüne kopyalayıp JMeter'ı yeniden başlatın.
JMeter ile MQTT 5 test edilebilir mi?
emqx/mqtt-jmeter eklentisi MQTT 3.1 ve 3.1.1'i belgeler. Testiniz reason code'lar, user properties veya session expiry gibi MQTT 5 özelliklerine dayanıyorsa emqtt-bench ya da xk6-mqtt ile k6 gibi MQTT 5 destekli bir araç kullanın.
Bir JMeter makinesi kaç MQTT bağlantısı açabilir?
Her JMeter thread'i bir MQTT bağlantısı tuttuğu için bu heap, CPU ve işletim sistemi limitlerine bağlıdır. Heap'i ve ulimit -n değerini artırın, GUI olmadan çalıştırın; on binlerce bağlantı gerekiyorsa dağıtık modu ya da emqtt-bench gibi daha hafif bir aracı kullanın.



