Skip to content
hello tis
Go back

2026년 8월 2주차 회고: JVM 네이티브 메모리 추적기 3편

3줄 요약

  • MALLOC_ARENA_MAX=4를 운영에 넣었다. 파드 시작 후 8일간 RSS 증가분이 605MiB에서 175MiB로 줄었고, 같은 기간 트래픽은 그대로였다.
  • 인사이트: 개선을 주장하려면 트래픽이 같았는지 먼저 확인해야 한다. 요청 수만 봐서는 모자란다.
  • 『주니어 백엔드 개발자가 반드시 알아야 할 실무지식』 4장도 읽었다. 타임아웃은 다운스트림 응답 시간 백분위로 잡는다. 다음 주는 5장이다.

지난주 Try 점검

이번 주의 문제: arena를 줄인 뒤 운영 RSS는 정말 안 오르나

이전 과정 요약

6월에 운영 인스턴스 한 대가 컨테이너 메모리 limit에 닿아 OOMKill로 재시작되는 장애가 있었다. 3주차에 힙 2GB, RSS 3.7GB, JVM이 스스로 아는 메모리(NMT committed)와의 격차 1.2GB를 확인했고, 8월 1주차에 원인을 확정했다. free된 메모리를 OS에 반환하지 않고 arena에 쥐고 있는 glibc였다. 처방 후보는 둘이었다.

상황

jemalloc은 폐기했다. arena 축소만으로 로컬에서 효과의 대부분이 나왔으니, 이미지와 배포를 바꾸는 비용을 낼 이유가 없다.

값은 4로 넣었다. 로컬에서 잰 건 2였지만, Hadoop은 2011년부터 hadoop-env.shMALLOC_ARENA_MAX=4를 기본으로 쓰고 Cassandra도 같은 값이다. 십 년 넘게 운영에서 돌아간 값이라 그대로 따랐다.

로컬에서는 격차(RSS − NMT committed)를 봤는데, 운영 대시보드에는 컨테이너 RSS만 있다. 그래서 아래는 전부 RSS로 잰다.

시도

  1. 배포. 환경변수 한 줄을 넣고 파드를 교체했다.

  2. RSS 추세 확인. 운영 대시보드의 RSS를 배포 전후로 이어 봤다. 파드가 갈릴 때마다 RSS는 1 GiB 아래에서 다시 시작하니, 파드마다 어디까지 오르는지를 봤다.

    7월 11일부터 8월 19일까지 파드별 RSS 꺾은선 그래프. 배포 전에는 파드가 교체될 때마다 RSS가 다시 올라 오래 산 파드는 3.63 GiB까지 갔고, MALLOC_ARENA_MAX=4를 넣은 마지막 파드는 8일째 2.12 GiB에서 평평하다

    • arena 기본: 파드가 갈릴 때마다 다시 올랐고, 가장 오래 산 파드는 3.63 GiB까지 갔다. 7월 23일에 뜬 다음 파드도 8일 만에 2.65 GiB에 닿았다(2.06 → 2.65, +605MiB)
    • MALLOC_ARENA_MAX=4: 이틀째부터 2 GiB 근처에서 평평하다. 8일째가 2.12 GiB로, 경과 1일의 1.95 GiB에서 175MiB 늘었을 뿐이다
  3. 트래픽과 응답 시간 확인. 트래픽이 줄어서 RSS가 안 올랐다면 개선이 아니다. arena를 줄이면 할당이 느려질 수도 있다. 세 가지를 봤다.

    배포 전후 트래픽과 응답 시간을 세 단으로 그린 도식. 세로축 수치는 생략했다. 총 요청량과 평균 동시 처리 요청 수는 주말에 낮아지는 하루 단위 봉우리가 배포 선 앞뒤로 같은 높이로 이어지고, 평균 응답 시간은 배포 시점에 값이 뛰지 않고 평평하다

    총 요청량 — 주말 peak가 주중의 절반 남짓까지 내려가는 모양이 배포 뒤에도 같고, 주중 peak 높이도 그대로다.

    평균 동시 처리 요청 수 — arena는 스레드 수를 따라 늘어나니 RSS에 더 가까운 지표다. 이것도 배포 앞뒤가 같고, 오히려 배포 뒤 주중 peak가 조금 더 높다.

    평균 응답 시간 — 배포 앞뒤 평균이 같다. 가장 높은 지점도 배포일이 아니라 나흘 뒤 토요일이다.

해결

트래픽이 같은데 8일간 RSS 증가분이 605MiB에서 175MiB로, 71% 줄었다. 로컬 실측의 75%와 거의 같은 폭이다. 배포 전에 가장 오래 산 파드가 3.63 GiB까지 갔던 것과 달리, arena=4 파드는 8일째 2.12 GiB에 머물러 있다.

다만 arena=4 파드는 이제 8일째다. 3.63 GiB까지 간 파드는 그보다 오래 살았고, arena=4 파드도 8일째에 한 번 뛰었다. 같은 기간을 더 지켜봐야 한다.

배운 것

arena 수를 줄인 뒤 확인할 것은 셋이다.

이번 주의 공부: 『주니어 백엔드 개발자가 반드시 알아야 할 실무지식』 4장

4장은 외부 연동이 문제일 때 살펴봐야 할 것들을 다룬다. 읽고 스터디 노트에 정리했고, 기억할 내용만 남긴다.

실무에 적용할 점

더 알아볼 것 / 질문

읽으면서 생긴 질문들이다. 답도 직접 찾아봤다.

다음 주 Try


Share this post:

Previous Post
2026년 8월 3주차 회고: DND 세미나 발표와 실무지식 5장
Next Post
JVM 네이티브 메모리 추적기: 힙 밖 1.2GB를 추적한 방법