Broker testleri

JMeter ile MQTT Yük Testi: Eklenti Kurulumu, Thread Group'lar ve Sonuçlar

Apache JMeter ile MQTT broker yük testi: MQTT eklentisini kurun, publisher ve subscriber thread group'ları oluşturun, GUI olmadan çalıştırıp sonuçları okuyun.

Güncellendi · 9 dk okuma

JMeter ile MQTT Yük Testi: Eklenti Kurulumu, Thread Group'lar ve Sonuçlar

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:

SamplerNe yapar
MQTT ConnectBir bağlantı açar (TCP, SSL, WS veya WSS) ve thread için açık tutar
MQTT Pub SamplerSeçilen QoS, retain bayrağı ve payload ile tek bir topic'e publish eder
MQTT Sub SamplerSubscribe olur ve gelen mesajları bir zaman penceresi ya da mesaj sayısı boyunca örnekler
MQTT DisConnectThread'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:

JMeter 5.6.3 ve MQTT eklentisini kurun
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ır

Yeniden 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:

mqtt-load.jmx — test plan ağacı
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. HOST değerini ${__P(host,broker.connectmq.com)}, PORT değerini ${__P(port,1883)} olarak tanımlayın, diğerlerini de aynı şekilde. __P, komut satırında -J ile verilen bir property'yi okur, yoksa varsayılan değere döner; böylece tek bir .jmx dosyası 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:

Plan'ı komut satırından çalıştırın
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

ListenerNe içinYük sırasında?
View Results TreeTek bir thread'de hata ayıklama, payload kontrolüHayır — kapatın
Summary Report / Aggregate ReportSampler başına hızlı sayılar, hata yüzdesi, throughputYalnızca GUI deneme çalışmalarında
.jtl dosyası + HTML dashboard (-e -o)Nihai rapor: percentile'lar, zamana göre throughputEvet
Backend Listener (InfluxDB)Uzun çalışmalarda Grafana'da canlı grafiklerEvet, 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:

SamplerGeçen süre şunu ifade ederDikkat edilecekler
MQTT ConnectCONNECT'ten CONNACK'e kadar (TLS handshake dahil)Ramp-up sırasında hatalar ve yavaş bağlantılar
MQTT Pub SamplerMesajı teslim etme süresi; QoS 1/2'de broker onayını bekleme süresi dahildirArtan süre = broker'dan veya ağdan gelen back-pressure
MQTT Sub SamplerYapı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 -n değ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ışı

  1. Tek bir bağlantıyı online client üzerinden elle doğrulayın.
  2. 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.
  3. 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.
  4. Her çalışmanın .jtl dosyalarını ve dashboard'larını broker'ın CPU, bellek ve bağlantı metrikleriyle birlikte saklayın.
  5. .jmx dosyası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.