MQTT 퍼포먼스 테스트: 벤치마크 도구와 방법
EMQX·HiveMQ·JMeter·k6 등 주요 MQTT 성능 테스트 도구 비교와 벤치마킹 절차, 측정 지표 및 실전 구성 포인트를 정리한 지침
목차
소개
MQTT는 경량 메시지 프로토콜로 IoT 환경에서 널리 사용된다. 서비스 안정성 확보를 위해서는 단순 연결 확인을 넘어 동시 연결, 처리량, 지연 시간 등을 검증하는 퍼포먼스 테스트가 필요하다. 이 글에서는 mqtt 성능 테스트 도구를 비교하고, mqtt 벤치마킹 방법과 mqtt load test 툴을 활용한 실무 절차를 초보자 관점에서 정리한다.
핵심 개념과 측정 지표
주요 측정 지표
- 처리량(throughput): 초당 전송되는 메시지 수
- 지연(latency): 발행 시점부터 수신 완료까지 시간 분포
- 연결율(connection rate): 초당 생성 가능한 연결 수
- 동시 연결(concurrent connections): 브로커가 유지 가능한 클라이언트 수
- 메시지 손실률(message loss): 전송 실패 또는 누락된 메시지 비율
- QoS별 성능: QoS 0, 1, 2에 따른 처리 오버헤드 비교
테스트 환경 구성 요소
- 브로커: 대상 브로커(로컬 또는 클러스터)와 버전 정보
- 클라이언트 드라이버: Paho, HiveMQ 등 사용 라이브러리
- 네트워크: 지연 및 대역폭 제한 여부
- 하드웨어: CPU, 메모리, 디스크 I/O
- 모니터링: CPU/메모리, 네트워크 사용량, 브로커 내부 지표
주요 도구 소개
가장 많이 쓰이는 도구는 다음과 같다. 각 도구는 목적과 스케일에 따라 적합성이 달라진다.
EMQX emqtt_bench
브로커 제조사에서 제공하는 벤치 도구는 브로커 특성에 맞춘 부하 생성과 내부 지표 연동이 용이하다. 대량 연결과 지속 메시지 발행 시나리오에 강점을 가진다.
HiveMQ Client 기반 벤치
Java 기반의 HiveMQ 클라이언트를 사용하면 JVM 환경에서 정교한 부하를 만들 수 있다. 복잡한 시나리오와 고사양 테스트에 적합하다.
JMeter + MQTT 플러그인
Apache JMeter는 익숙한 부하 테스트 도구로, MQTT 플러그인을 통해 메시지 발행/구독 시나리오를 스크립트화할 수 있다. 그래픽 인터페이스로 설정하고 리포트를 바로 확인하기 쉬운 장점이 있다.
k6 + MQTT 익스텐션
k6는 코드 기반의 성능 테스트 도구로, MQTT 확장을 통해 스크립트형 부하 테스트를 진행할 수 있다. CI 파이프라인에 통합하기 좋다.
mosquitto_pub/sub (간단 검증용)
경량 브로커인 mosquitto의 클라이언트는 빠른 기능 확인이나 소규모 부하 생성에 유용하다. 대규모 벤치에는 제약이 있지만, 기본 동작 확인과 스크립트 연동에는 편하다.
벤치마킹 방법론
단계별 절차
- 목표 정의: 테스트 목표(동시 연결 수, 메시지 크기, 지속 시간)를 명확히 한다.
- 시나리오 설계: 정상/과부하/복구 등 상황별 워크로드를 작성한다.
- 환경 준비: 브로커 설정, 모니터링 도구, 네트워크 조건을 고정한다.
- 워밍업: 부하 전 브로커와 클라이언트를 워밍업 상태로 만든다.
- 짧은 테스트 실행: 작은 스케일로 동작 확인 후 확장한다.
- 본 테스트: 단계적(스텝) 혹은 선형 증분(load ramp-up) 방식으로 진행한다.
- 결과 수집: 로그, 지표, 메시지 손실률, 지연 분포를 수집한다.
- 분석 및 튜닝: 결과 기반으로 브로커 설정, 네트워크, 클라이언트 설정을 조정한다.
주의할 점
- 모든 테스트는 동일한 환경에서 반복해야 재현 가능하다.
- 모니터링을 켜지 않으면 병목 원인을 파악하기 어렵다.
- QoS와 메시지 크기는 성능에 큰 영향을 준다. 테스트 시 고정값으로 제어한다.
간단한 실행 예제
작은 규모의 발행 테스트는 mosquitto_pub으로 빠르게 검증 가능하다.
mosquitto_pub -h broker.example.com -p 1883 -t sensors/room1 -m "{\"temp\":22}" -q 0 -r -l
Python으로 동시 연결을 만들어 간단한 측정 스크립트를 작성할 수도 있다. 아래는 paho-mqtt을 이용한 예시(동시성은 스레드나 asyncio로 확장).
import paho.mqtt.client as mqtt
import time
client = mqtt.Client()
client.connect('broker.example.com', 1883, 60)
for i in range(1000):
payload = f'{{"seq":{i}}}'
client.publish('test/topic', payload, qos=0)
time.sleep(0.001)
client.disconnect()
결과 해석과 보고
수집한 지표는 단순 평균보다 분포(퍼센타일)를 확인해야 한다. 평균 지연이 양호해도 95/99 퍼센타일에서 큰 지연이 발생하면 사용자 경험에 영향이 있다. 메시지 손실과 재전송 비율은 QoS별로 비교하고, 연결 실패는 네트워크나 인증 문제도 점검한다.
실무 팁
- 테스트마다 브로커 로그와 시스템 지표를 동시에 수집한다.
- 핫스팟 토픽을 피하고 퍼블리셔/구독자를 분산 배치한다.
- 자동화: 스크립트로 반복 테스트를 구성해 변화에 따른 추이를 관찰한다.
- 작은 단위로 문제를 찾고 점진적으로 스케일을 올린다.
결론
MQTT 성능 테스트는 도구 선택과 명확한 시나리오 설계가 핵심이다. mqtt 성능 테스트 도구와 mqtt 벤치마킹 방법을 숙지하면 안정적인 서비스 운영이 가능하다. 실무에서는 emqx나 hivemq 같은 벤치 도구와 JMeter/k6 같은 범용 도구를 조합해 다양한 각도에서 검증하는 접근을 권장한다.