레디스 모니터링 시 주의사항 (Redis monitoring/single thread)

TL;DR

Redis는 싱글 쓰레드로 동작 하므로 CPU 모니터링을 할때 redis 프로세스를 따로 모니터링 해 줘야 합니다. 그렇지 않으면 redis의 cpu가 100을 치고 hang 걸린 상황에서 전체 코어 중 하나의 코어만 다 쓰는 상황이라 알람이 발생 하지 않을 수 있습니다.

CPU 사용량 모니터링

대부분의 사이트에서는 zabbixprometheus 혹은 ELK stack 등의 오픈소스를 활용하던지 혹은 자체적으로 개발한 툴을 이용하던지 어떤 식으로든 안정적인 서비스를 위해 인프라와 어플리케이션을 모니터링 하고 임계치를 설정하여 알람을 받고 있을 것 입니다.

이때 가장 기본적으로 모니터링 하는 것중 하나가 CPU Usage 인데 보통은 CPU user time + system time + iowait time 더한 값을 usage로 보고 각 운영 환경에 맞는 임계치를 두고 알람을 받습니다.
70% 이상 warning, 90% 이상 high, 100% critical 등의 기준을 잡고 10분간 3회 이상 연속으로 발생시 알람을 발생 시키는 트리거를 예로 들 수 있겠네요.

Redis가 올라가 있는 인프라 (VM 혹은 서버) 의 CPU 모니터링 할 때 주의 할점

redis 홈페이지에 올라와 있는 벤치마크관련 포스트 를 보면 아래와 같이 나와 있습니다.

Redis is, mostly, a single-threaded server from the POV of commands execution (actually modern versions of Redis use threads for different things). It is not designed to benefit from multiple CPU cores. People are supposed to launch several Redis instances to scale out on several cores if needed. It is not really fair to compare one single Redis instance to a multi-threaded data store.

Redis는 ** 싱글 쓰레드로 동작 ** 하고 멀리 코어의 이득을 볼 수 있게 설계 되어 있지 않다고 쓰여 있는데 이게 굉장히 중요 합니다.
요즘 운영서버에 올리는 VM들은 못해도 4core 이상은 될 것인데(서버를 직접 사서 베어메탈 장비를 그대로 데이터 센터에 놓고 쓰고 싶다면 8core 이하는 주문하기도 거의 불가능 합니다.)
예를 들어서 redis를 4 vcore vm에 올렸다고 가정 해 보겠습니다.

  • redis에 엄청난 부하가 몰려서 cpu를 100% 다 쓰는 상황이 발생 합니다.
  • 모니터링 시스템에는 cpu usage가 70% 이상일 때만 알람을 받게 설정 되어 있습니다.
  • redis는 싱글 쓰레드로 동작 하기 때문에 한개의 core만 100% 점유하고 있습니다.
  • 같은 서버에 올라가 있는 나머지 시스템들의 CPU 사용량이 미미하다면 CPU usage는 25% 정도로 높지 않습니다. (전체의 1/4)

위와 같은 상황이 발생하면 redis에서 응답을 늦게 주거나 아예 튕겨 내게 될 것이고 이로 인해 서비스 장애로 이어질 수 있습니다.
CPU는 크게 높지 않기 때문에 네트워크나 OS, host 머신 등 다른 부분들은 점검하느라 시간을 허비 할 확률이 큽니다.

이런 경우를 방지하기 위해서 Redis의 프로세스만 따로 모니터링 해 주는게 중요 합니다.

  • zabbix 의 경우 Item Key를 다음과 같이 설정하면 모니터링 가능

    1
    proc.cpu.util[,계정,,redis-server]
  • shell을 이용하는 경우 (bash shell 전문가님들은 분명 더 좋은 방법이 있겠지만 저는 아래와 같이 테스트 해 봤습니다)

    1
    top -n 1 -p $(pidof redis-server) | sed -n '8,9p' | awk '{print $9}'
Share