Amazon ElastiCache for Redis에서 자체 설계한 클러스터의 CPU 사용량 증가 문제를 해결하고 싶습니다.
간략한 설명
다음은 Redis용 ElastiCache에 대한 Amazon CloudWatch CPU 메트릭입니다:
- EngineCPUUtilization: Redis 엔진 스레드의 CPU 사용률을 보고합니다. Redis는 단일 스레드입니다. vCPU가 4개 이상인 노드에 대해 EngineCPUUtilization 메트릭을 모니터링하는 것이 좋습니다.
- CPUUtilization: 호스트의 CPU 사용률을 나타냅니다. vCPU가 2개 이하인 소규모 노드의 경우 CPUUtilization 메트릭을 사용하여 클러스터 워크로드를 모니터링합니다.
해결 방법
높은 EngineCPUUtilization 문제 해결
높은 EngineCPUUtilization 문제를 해결하려면 다음을 확인합니다.
- CPU 시간을 많이 소비하는 장시간 실행 명령: keys, hkeys, hgetall과 같이 시간 복잡도가 높은 명령은 CPU 시간을 많이 소비합니다. 명령의 시간 복잡도 및 성능 제안을 확인하려면 Redis 웹사이트에서 Commands를 참조하세요. Lua 스크립트를 사용하는 경우 런타임 동안 모든 서버 활동이 차단되고 EngineCPUUtilization이 증가합니다. Lua 스크립트는 EVAL 및 EVALSHA Redis 명령에 사용됩니다. 자세한 내용은 Redis 웹사이트에서 Lua, EVAL 및 EVALSHA로 스크립팅을 참조하세요. 오래 실행되는 명령 또는 Lua 스크립트를 확인하려면 Redis SLOWLOG를 사용하세요.
- 많은 수의 요청: 명령 통계를 확인하여 명령 버스트 또는 지연 시간 증가를 식별하세요. 명령 통계를 확인하려면 GetTypeCmds 또는 HashBasedCmds와 같은 CloudWatch 메트릭을 사용합니다. 또는 Redis INFO 명령을 사용합니다. 자세한 내용은 Redis 웹사이트에서 INFO를 참조하세요. 요청 수가 많고 애플리케이션 워크로드가 예상과 같으면 클러스터의 규모를 조정합니다.
- 백업 및 복제: 백업 또는 복제가 발생한 경우 SaveInProgress 메트릭을 확인합니다. 이 이진 메트릭은 백그라운드 저장(포크 또는 포크리스)이 진행 중이면 1를 표시하고, 백그라운드 저장이 진행되지 않으면 0를 표시합니다. Redis 스냅샷을 만들 수 있는 충분한 메모리가 있는지 확인하세요.
- NewConnections 수 많음: 단기간에 많은 수의 새 클라이언트 연결 요청이 발생하면 EngineCPUUtilization가 증가할 수 있습니다. 많은 수의 연결을 처리할 때의 모범 사례는 모범 사례: Redis 클라이언트 및 Amazon ElastiCache for Redis를 참조하세요. Redis 6.2 이상에서는 성능 개선이 구현되었습니다. 자세한 내용은 ElastiCache for Redis 6.2(고급)를 참조하세요.
- 키 제거 횟수 증가: Redis는 maxmemory-policy 매개 변수에 따라 키를 제거합니다. 캐시에 새 데이터를 저장할 메모리가 충분하지 않을 때 제거가 발생합니다. 제거량이 높으면 Redis는 키를 제거하는 데 더 많은 CPU 리소스를 사용하며 EngineCPUUtilization가 증가합니다. 퇴출 볼륨을 모니터링하려면 CloudWatch 메트릭 제거를 사용합니다. 퇴거 볼륨이 높으면 더 큰 노드 유형을 사용하거나 노드를 더 추가하여 클러스터를 확장하세요.
- 많은 회수 횟수: 메모리를 확보하기 위해 Redis는 타임아웃 만료에 도달한 키를 샘플링하고 삭제합니다. 이 프로세스를 회수라고 합니다. 만료 횟수가 많으면 CPUUtilization 및 EngineCPUUtilization가 증가할 수 있습니다. 키 만료 이벤트 수를 모니터링하려면 CloudWatch 메트릭 Reclaimed를 사용하세요. 너무 많은 키가 동시에 만료되지 않도록 하는 것이 좋습니다. 키가 서로 다른 시간 간격으로 만료되도록 하려면 EXPIREAT 명령을 사용하거나 키에 대해 서로 다른 TTL 값을 설정하세요. 자세한 내용은 Redis 웹사이트에서 EXPIREAT를 참조하세요.
높은 CPU 사용률 문제 해결
높은 CPUUtilization 문제를 해결하려면 다음을 확인합니다.
- 높은 네트워크 트래픽 또는 연결: 네트워크 트래픽 또는 연결이 많으면 Amazon ElastiCache Redis에서 CPUUtilization가 증가할 수 있습니다. 네트워크 트래픽 또는 연결이 높은지 확인하려면 NewConnections, NetworkBytesIn, NetworkBytesOut, NetworkPacketsIn, NetworkPacketsOut CloudWatch 지표를 확인합니다.
- 다른 스레드에서 처리하는 비동기 I/O: 지원되는 노드 유형의 경우, 향상된 I/O는 전용 스레드에서 네트워크 I/O를 처리하도록 설계되었습니다. 또한 Redis 버전 6.2 이상에서는 TLS 오프로딩이 지원되며, Redis용 ElastiCache가 I/O 스레드에서 TLS 작업을 수행할 수 있습니다. TLS 작업은 노드에서 사용 가능한 추가 CPU 코어를 사용하며, 이 추가 CPU 사용으로 인해 CPU사용률이 증가할 수 있습니다. 자세한 내용은 Amazon EC2 M5 및 R5 인스턴스를 통한 Amazon ElastiCache 성능 향상을 참조하세요.
- 지속적인 관리형 유지보수 및 서비스 업데이트: 유지 관리 및 서비스 업데이트에는 컴퓨팅 용량이 필요하며 CPUUtilization이 증가할 수 있습니다. 유지 관리 기간을 확인하여 CPUUtilization의 증가가 동시에 발생하는지 확인하세요. 유지 관리 기간을 사용량이 적은 기간으로 설정하는 것이 가장 좋습니다. 자세한 내용은 Amazon ElastiCache 관리형 유지 관리 및 서비스 업데이트 도움말 페이지를 참조하세요.
- 높은 페이징 및 작업: 노드의 메모리가 부족하여 커널이 메모리를 스왑으로 페이지 아웃할 수 있습니다. 이 작업을 수행하면 성능이 저하될 수 있습니다. 페이징이 과도하면 CPUUtilization가 증가할 수 있습니다. 또한 backup 또는 스케일링과 같은 작업이 발생할 때 노드의 부하가 높으면 CPUUtilization가 증가할 수 있습니다. 자세한 내용은 Amazon CloudWatch를 사용하여 Amazon ElastiCache for Redis로 모범 사례 모니터링을 참조하세요.