🎯 Redis Pub/Sub 성능 테스트 개요
업무 프로젝트에서 Redis Pub/Sub을 활용하여 30개의 센서에서 초당 40KB 데이터를 발행(Publish) 하는 환경을 구축했습니다. 하지만 실제 부하 테스트를 진행한 결과, 메시지 수신 지연 및 성능 최적화가 필요한 부분이 발견되었습니다.
이번 테스트에서는 Redis의 성능을 검증하고, 부하가 증가했을 때의 메시지 처리 속도와 메모리 사용량을 분석했습니다. 이를 통해 Redis Pub/Sub을 활용할 때 고려해야 할 최적화 방안을 도출하고자 합니다.
1️⃣ 테스트 환경 및 실행 방법
✅ 테스트 목표:
- Redis Pub/Sub의 부하 처리 성능을 검증
- 메시지 수신 딜레이 및 손실 여부 확인
- 부하 상황에서 메모리 및 네트워크 성능 분석
✅ 테스트 환경:
- Redis 버전: 7.0+
- 운영 방식: Docker 컨테이너 기반
- 테스트 도구: redis-benchmark, redis-cli, info memory, info stats
✅ 실행 방법:
1. Publisher(발행자) - 30개의 센서 데이터 전송
while true; do docker exec -it redis-server redis-cli PUBLISH sensor-data "Test message"; sleep 0.1; done
2. Subscriber(구독자) - 메시지 수신 확인
docker exec -it redis-server redis-cli
127.0.0.1:6379> SUBSCRIBE sensor-data
3. 성능 부하 테스트 (redis-benchmark)
docker exec -it redis-server redis-benchmark -t publish -r 100000 -n 100000 -P 30
4. 메모리 사용량 및 성능 통계 확인
docker exec -it redis-server redis-cli info memory
docker exec -it redis-server redis-cli info stats
2️⃣ 테스트 결과 분석
✅ 1. 메모리 사용량 (info memory)
항목 | 결과값 | 의미 |
used_memory_human | 1.16MB | 현재 Redis가 사용 중인 메모리 |
used_memory_peak_human | 1.33MB | 메모리 사용량 피크 (최대치) |
mem_fragmentation_ratio | 9.34 | 메모리 단편화 비율 (최적화 필요) |
maxmemory_policy | noeviction | 메모리 초과 시 데이터를 삭제하지 않음 |
📌 결론:
- 메모리 사용량은 비교적 낮게 유지되었으며, 메모리 부족으로 인한 성능 저하는 없음
- 다만, 메모리 단편화 비율(9.34)이 높음 → 최적화 필요
3️⃣ Redis Pub/Sub 최적화 방안
📌 1. 성능 최적화를 위한 조치
✔ notify-keyspace-events 활성화하여 이벤트 처리 성능 개선
✔ active-defrag yes 설정하여 메모리 단편화 문제 해결
✔ maxmemory 정책을 적절히 설정하여 메모리 관리 최적화
📌 2. Redis Streams 도입 고려
현재 Redis Pub/Sub은 높은 부하에서 딜레이가 발생할 가능성이 있음.
✅ Redis Streams는 Pub/Sub보다 안정적인 메시지 보관 기능 제공
✅ 메시지 유실 방지 기능이 있어 대량의 데이터 처리에 적합
XADD sensor-data-stream * message "High Performance Stream Message"
🚀 결론: Redis Pub/Sub vs Redis Streams?
🔹 Redis Pub/Sub
✔ 실시간 메시징이 필요할 때
✔ 메시지 손실이 큰 문제가 되지 않을 때
✔ 단순한 이벤트 브로드캐스팅 목적
🔹 Redis Streams
✔ 메시지 순서 보장이 필요할 때
✔ 과거 메시지 조회 및 재처리가 필요할 때
✔ 대량의 데이터 처리가 필요할 때
✅ 현재 Redis Pub/Sub은 정상 작동하지만, 고부하 환경에서는 Redis Streams와 Cluster Mode 고려 필요! 🚀🔥
'프로그래밍' 카테고리의 다른 글
📌 [개인기록] Git 협업 및 브랜치 전략 정리 (0) | 2025.02.12 |
---|---|
📌 [Docker] Docker를 활용한 Go, React, MariaDB 애플리케이션 배포 가이드 (0) | 2024.12.18 |
웹서버 이중화 로드밸런싱 기록용 (1) | 2024.01.11 |
rufus로 ubuntu iso 부팅파일 만든 usb 복구 (0) | 2023.07.05 |
[Linux] 리눅스 외부 연동 방법 (feat VM VirtualBox) (0) | 2023.05.22 |