Search
moon
sun

EKS 컨테이너 메모리 스파이크 추적기

URL
생성 일시
2026/08/27 09:06
최종 편집 일시
2026/08/27 09:06
태그
여기어때
파일과 미디어
|| 글. Remy(유정인) / 검색플랫폼개발팀 요약: EC2에서 EKS로 옮긴 뒤 두 시간마다 메모리가 500MB씩 튀었습니다. 원인은 로그 gzip 압축과 페이지 캐시였습니다. 안녕하세요. 검색플랫폼개발팀 레미입니다. 토요일 새벽 한 시가 다 된 시각에, 메모리 사용률이 90%를 넘었다는 알림을 받았습니다. 배포한 지 일주일쯤 된 시점이었습니다. 저희 API를 띄워둔 파드 여러 대의 메모리가 며칠에 걸쳐 조금씩 올라가고 있었고, 그중 한 대는 급하게 치솟은 뒤로 내려오지 않고 있었습니다. 더 두면 알림이 계속 울릴 것 같아 전부 재시작했습니다. 상황을 정리하면서, 저는 이번 것이 전에 본 것과 비슷한 패턴이라고 적었습니다. 쓰고 나서 그 한 줄이 눈에 걸렸습니다. 처음이 아니라는 뜻이었으니까요. 이 일만 붙들고 있을 수는 없었습니다. 다른 일을 하다가 틈이 나면 그래프를 다시 열어보는 식이었습니다. 그러다 원인이 잡힌 건 두 달쯤 뒤였고, 모든 서비스에 조치가 들어간 건 넉 달쯤 뒤였습니다. 그 사이에 힙 바깥 네이티브 메모리, GC 교체, ZGC 자체를 차례로 의심했습니다. 셋 다 아니었습니다. 1. 그 전에, 서버를 옮겼습니다 이 API는 원래 EC2 여러 대에서 돌았습니다. 젠킨스가 도커 이미지를 만들어 각 서버에 띄우는 방식이었고, 그때 컨테이너에는 메모리 상한도 CPU 상한도 없었습니다. docker-compose 파일에 그런 설정 자체가 없었으니까요. 서버 자원은 넉넉했고, 로그는 호스트 디스크에 쌓였고, 그 로그는 별도의 수집 프로그램이 따로 가져갔습니다. 그러다 EC2에 있던 API들을 EKS로 옮기게 됐습니다. 저희 팀만의 일은 아니었고, 비슷한 시기에 여러 팀이 각자의 API를 옮기고 있었습니다. 저희 팀에서 이관을 진행했고, 1월 중순의 어느 하루에 커밋 두 개가 들어갔습니다. 하나는 애플리케이션 쪽, 하나는 배포 매니페스트 쪽이었습니다. 그날 바뀐 것을 지금 다시 보면 이렇습니다. 서버/파드 한 대가 쓸 수 있는 메모리 — EC2 시절 8GB (서버 전체) → EKS 이후 4GB (+ 90% 알림) 컨테이너 메모리 상한 — EC2 시절 없음 → EKS 이후 4GB CPU 상한 — EC2 시절 없음 → EKS 이후 2코어 로그 저장 위치 — EC2 시절 호스트 디스크 → EKS 이후 파드의 임시 볼륨 로그 수집 — EC2 시절 별도 프로그램 → EKS 이후 같은 볼륨을 보는 사이드카 자바 힙 — EC2 시절 1GB~2GB (가변) → EKS 이후 2GB 고정 사양을 줄인 건 실수가 아니었습니다. EC2 시절에는 서버를 넉넉하게 잡아 두고 러프하게 쓰고 있었거든요. 컨테이너에 상한이 없으니 굳이 맞출 이유도 없었고요. 이관 계획서에도 자원이 놀고 있고 그만큼 비용이 새고 있다는 진단이 적혀 있었고, 기대 효과 첫 줄은 비용 절감이었습니다. 파드에 걸 상한도 그 목표에 맞춰 잡았습니다. 처음 검토했던 8GB에서 절반인 4GB로요. 여기에 하나를 더 얹어야 합니다. 저 4GB를 자바 혼자 쓰는 게 아닙니다. 자바 힙 바깥의 네이티브 메모리도, 로그 파일을 만질 때 생기는 캐시도 그 안에서 나눠 씁니다. 파드에는 애플리케이션만 뜨는 것도 아닙니다 — 로그를 실어 나르는 수집기가 사이드카로 같이 뜨는데, 그건 자기 몫을 따로 받습니다. 저 4GB 안에서 자바 힙 밖으로 나가는 몫이 생각보다 많습니다. EC2 시절 서버는 한 대에 8GB였고, 그 안에서 자바 힙이 최대 2GB를 썼습니다. 나머지 6GB는 자유롭게 남아 있었습니다. EKS로 옮기면서 파드에 건 상한은 4GB였습니다. 힙은 2GB 그대로였으니, 힙 밖에 남는 여유가 6GB에서 2GB로, 3분의 1이 됐습니다. 그리고 그 위에 90% 알림선이 그어졌습니다. 그리고 같은 커밋에 이런 변경이 하나 더 있었습니다. 커밋 메시지를 그대로 옮기면 이렇습니다. AccessLog tomcat 방식에서 custom으로 처리 - tomcat은 압축 지원을 안하므로 변경 접속 로그를 톰캣이 쓰던 방식에서 로깅 라이브러리(