AWS > CloudWatch > RDS

CPU 사용률이 오전 9:20분에 53.3%를 찍었다.
오전 9:30분에는 34.0%로 슬슬 내려오더니, 9:45분이 되어서야 2.9%대로 해소되었다.
동시에 DB커넥션량은 평균 1,375대에서 오전 9:25분경에는 1,471개를 찍었고,
14:40분의 1,535개를 마지막으로 서서히 내려가 14:50분경에 870개로 회복되었다.
가용메모리량은 CPU 사용률이 급격하게 증가한 시간대에 맞춰
평소 1.4G 정도에서 오전 9:20분경 1.2G로 감소하기 시작했고,
오전 9:20 ~ 14:40분까지 1.0G를 유지했다.
다행히 14:45분서부터 1.3G로 회복되기 시작하면서, 14:50분서부터 현재 15:38분까지 1.8G로 회복되었다.
1. CPU사용량 급감 원인
동일한 DB를 웹프로젝트와 영업관리 프로그램 총 2개의 프로젝트가 붙어서 사용하고 있다.
내 담당인 웹프로젝트는 배포 및 소스 수정 이력이 없고, 로그도 별다른 특이점이 발견되지 않아 고려대상이 아니다.
웹이 아닌, 자바로 짜여진 실행 프로그램인 영업관리 프로그램이 원인이었다.
해당 프로그램에서 협력사 직원이 주문내역 데이터를 조회하던 도중,
조회 범위를 넓게 잡아서 데이터 요청에 대한 응답이 돌아오기까지 약 1분 30초 가량이 소요되었던 것이 원인이다.
보통 20초 내로 응답이 돌아와야 정상적이나,
20초 이상, 1분 30초 가량의 응답 지연이 있었던 것이 CPU 사용량을 순간적으로 많이 잡아먹은 원인이다.
이전에는 조회 범위 조건 관련 미흡한 분기처리로 인해
방대한 양의 주문 데이터를 한꺼번에 조회하는 것에 대한 시도로 인하여
CPU 사용률 99%를 찍었던 적도 있었으며, 그에 대한 여파로 가용메모리량이 알림 임계선인 800MiB 이하까지 내려간 적이 있었다.

해당 이슈 원인 또한 오늘 발생한 원인과 비슷하다.
영업관리 프로그램에서 주문내역 조회에 대한 응답이 지연되고 있는 시간 동안
CPU 사용률은 급증하고 있으며, 그와 동시에 가용메모리량의 급감이 이루어진다.
다행히 응답이 지연되고 있음을 인지하고 해당 페이지를 종료하여 응답 시도를 강제로 멈추거나,
서버 내에서 응답 시간에 대한 타임아웃을 지정하면 CPU 사용률은 금방 회복된다.
그러나, 문제는 가용메모리량의 회복 시간이다.
2. 가용메모리량의 더딘 회복 속도
CPU 사용률은 금방 회복되는데 반해, 가용메모리량은 금방 회복되지 않는다.
오늘 발생한 이슈에 대해서 예로 들자면,
CPU 사용률이 오전 9:20 ~ 9:35분 약 15분 가량 53.3% ~ 31.2% 기록 후 9:40분서부터 10.0%대로 감소하여 금방 회복된 반면,
가용메모리량은 오전 9:20 ~ 14:40분 약 5시간 20분 가량 감소된 양으로 유지되었다.
CPU 사용률이 급증하면, 가용메모리량은 약 5시간 이상의 시간이 흐르고 나서야 회복되는 것이다.
CPU가 회복되었다고 바로 메모리가 회복되지는 않는 것이 문제이다.
JDBC 커넥션 풀은 사용한 커넥션을 바로 닫지 않고 풀에 유지한다.
따라서 RDS에서 동일 이슈 시각에 급증한 DB커넥션 수치가 바로 내려가지 않는다.
응답 시간이 걸리는 경우에도 사용된 버퍼 캐시, 정렬/조인용 임시 공간 등이 GC(가비지 컬렉터)나 LRU 정책에 따라 점진적으로 해제된다. 즉, 메모리 회복까지 시간이 걸린다는 이야기다.
리눅스 커널 페이지 캐시 등도 한 번 사용하면 바로 반환되지 않고 점진적으로 회수된다.
결론.
- 응답이 돌아와도 커넥션 풀과 메모리 회복은 시간이 걸림
- 커넥션 수치와 가용메모리는 즉시 정비되지 않음
- 만약 RDS 커넥션 풀 사이즈가 크거나 쿼리가 무거운 경우, 피크 순간 이후에도 메모리가 장시간 낮게 유지될 수 있음
긴 쿼리 또는 응답 지연으로 인해 CPU와 메모리 버퍼가 점유된 상태이고,
쿼리가 끝나도 OS/DB 레벨에서 캐시와 커넥션 풀 때문에 메모리가 천천히 반환되는 것이 원인이다.
3. 해결
CPU 사용량 급증 및 가용메모리량의 급감을 해결할 수 있는 원인은,
이슈 발생 원인을 차단하는 것.
이슈의 원인은 크게 두가지이다.
- 영업관리 > 주문내역 > 페이징 미처리
- 영업관리 > 주문내역 > 날짜 데이터 오입력 시 분기처리 미흡
현재는 두가지를 파악하여 개선 요청 드린 상태.
현재 밀린 일정이 많아 바로 개선은 어려우니,
그때까지 모니터링을 해야 할 것 같다.
'[Project] > 업무일지' 카테고리의 다른 글
| [에러 핸들링] 파라미터 내 처리 불가 데이터 삽입 시 톰캣 기본 에러페이지 내 서버 버전 미노출 처리 (0) | 2025.09.17 |
|---|---|
| [에러 핸들링] 잘못된 메소드 호출에 대한 응답 내 서버 버전 미노출 처리 (0) | 2025.09.17 |
| [카카오 로그인 API] 테스트앱 설정 (2) | 2025.08.12 |
| [Oracle 12c] SQL Error [1502] [72000]: ORA-01502: 인덱스 또는 인덱스 분할영역은 사용할 수 없는 상태입니다 (0) | 2025.07.29 |
| [Ajax/Get요청] GET 400 (Bad Request) (2) | 2025.07.21 |