인프라

ECS 의 OutOfMemory 오류 해결과정(feat. 502 에러가 발생하는데요)

jwKim96 2022. 9. 16. 12:48

이전에 goorm 에서 개최했던 장애 대응 세미나에 참석한 적이 있습니다.
세미나에서 장애를 해결만 하고 넘어가기 보다는 이 과정을 되돌아보며 회고하는 과정이 중요하다고 했던 것이 인상깊었는데요.
마침 사이드 프로젝트 배포 및 테스트를 하던 과정에서 발생한 장애 해결 과정을 기록으로 남기기 위해 글을 작성합니다.

1. 개요

프로젝트 막바지에 QA 를 위해 모든 팀원들이 함께 서비스의 이곳 저곳을 쑤시며 테스트를 하고 있었습니다.
그러던 중 팀원이 보내준 장애 사진으로부터 장애 상황 인지하고 장애 대응이 시작되었습니다.

2. 트러블 슈팅 과정

1) AWS ALB 대상그룹 Health Check 확인

⇒ 대상그룹에 포함된 인스턴스 정상 확인되어 그 다음으로 ALB 모니터링 지표 확인해보기로 함

2) ALB 모니터링 지표 확인

⇒ 'ELB 5xx', 'HTTP 502s' 지표가 상승한 것을 확인
⇒ 인프라의 문제라고 확신하고, 서비스 런타임이 있는 ECS 로 이동

3) AWS ECS 클러스터의 서비스가 정상적으로 실행중인지 확인

⇒ 서비스는 정상적으로 실행되고 있었지만 어딘가 비정상적인 부분이 있을 것이라 생각하고 조금 더 탐색

4) 클러스터의 해당 서비스 작업 이력 조회(Running, Stopped)

⇒ Stopped 작업에서 'OutOfMemory' 오류로 컨테이너 종료 로그 발견
⇒ 컨테이너가 종료된 시간과 ALB 모니터링 지표 확인시 5xx 에러 발생 시간이 겹침

이해를 돕기 위해 가져온 사진(캡처를 못했음)

5) ECS 서비스의 메모리 사용량(MemoryUtilization) 지표 확인

⇒ 100% 에 가까운 메모리를 사용하고 있는것을 확인

6) ECS 작업에 정의된 Memory 설정 확인

⇒ ECS 컨테이너 메모리 제한 변경 (하드제한:256mb -> 소프트제한:256mb / 하드제한:512mb)

7) 기존 작업 중지 후 새 작업 실행(메모리 제한 변경 반영)

8) 정상 상태 모니터링

⇒ API 호출 정상 확인
⇒ 약 일정 기간 동안 수시로 ALB 모니터링 지표 확인하며 2xx, 5xx 추이 확인
⇒ 5xx 는 더이상 발생하지 않아 상황 종료라고 판단

3. 발생 원인 분석

  1. API 서버 실행 중 메모리가 100% 가까이 사용되었음(2.5 참조)
  2. 메모리 사용량이 기존에 설정한 하드 제한을 넘김
    • 하드 제한 초과시, 해당 작업의 컨테이너가 종료됨
    • ECS 클러스터의 서비스는 일정 개수 이상의 작업을 유지하기 위해, 다시 작업을 실행(컨테이너 재실행)
  3. 컨테이너 종료 및 재시작 중 ALB 의 Health Check 가 성공하기 전에 API 요청시 502 Bad Gateway 발생

4. 개선 방향

  • API 를 호출해서 장애를 알게 되었는데, 사전에 알 수 있는 방법이 필요함
  • 특정 지표들에 대한 알림이 필요함
    • EC2 혹은 ECS 서비스, ECS 컨테이너의 메모리 사용량에 대한 알림이 필요할 것 같음
      • ECS 작업에 메모리 하드제한이 걸려있어, 100% 에 가까운 메모리를 사용하게 되면 서버가 다운됨
        그래서 사전에 인지할 수 있도록 일정 이상 메모리 사용량이 올라갈 경우에 대한 알림이 필요함
    • HTTP 5xx 에러에 대한 알림이 필요할 것 같음
      • 5xx 에러는 발생하기 시작하면 알림을 해야할 것 같음