본문으로 이동
Reactor Netty Memory Leak 이슈 탐방기
문서

Reactor Netty Memory Leak 이슈 탐방기

김성현 토스 · 토스 기술 블로그

원문 보기

AI 핵심 요약

Spring Cloud Gateway와 Spring WebClient를 사용하는 서비스에서 컨테이너 RSS가 계속 증가하고 Netty의 ByteBuf 누수 경고가 발생해 원인을 추적했습니다. Gateway에서는 CacheRequestBody 필터가 캐싱한 요청 바디를 해제하지 않는 버그를 확인해 수정 사항이 반영된 버전으로 해결했습니다. WebClient에서는 connection pool의 연결 해제를 막으려고 Mono.cache()를 적용했지만, 취소 시 응답 바디 해제 로직도 건너뛰어 누수가 발생했으며 취소 여부를 추적해 바디를 명시적으로 release하도록 바꿨습니다. 두 사례 모두 Reactor Netty의 Direct Buffer가 native memory에 할당되고 reference count로 관리되므로, 요청·응답 바디의 사용과 해제 경로를 꼼꼼히 확인해야 한다는 점을 보여줍니다.

  • 컨테이너 OOM을 조사할 때 JVM Heap 지표만 보지 말고 RSS와 Netty Direct Buffer 사용량도 함께 확인하세요.
  • Reactor Netty의 ByteBuf는 reference count가 0이 되어야 풀로 반환되므로, 사용이 끝난 버퍼는 반드시 release해야 합니다.
  • Mono.cache()는 취소 신호를 원본 요청에 전달하지 않으므로, 취소 시 응답 바디를 명시적으로 정리하는 처리가 필요할 수 있습니다.
  • Spring Cloud Gateway의 CacheRequestBody 필터는 사용 중인 버전의 메모리 해제 관련 수정 사항을 확인하세요.

소개

Spring Cloud Gateway와 Spring WebClient를 이용하면서 발생한 Memory Leak 이슈의 발생 원인과 해결 과정을 소개합니다.

비슷한 학습 자료

컨퍼런스 SLASH

서버 프로세스가 내려갔을 때 코드와 Java 모니터링으로 원인을 못 찾는다면 어떻게 해야 할까요? 생각만 해도 막막한 이 순간, 원인을 찾아가는 과정을 공유합니다. 박동호 / 토스 Server Developer 발표 자료 👉🏻 https://bit.ly/3NLXTg5 토스 개발자 컨퍼런스 SLASH에 대한 자세한 정보는 👉🏻 https://toss.im/slash-22 컨퍼런스 및 세션에 대한 문의는 👉🏻 slash@toss.im #토스 #개발자컨퍼런스 #SLASH

프로그래밍 언어 시스템 · 운영체제

문서 박지원

Spark Connect 서버에 세션이 몰리면, 무거운 작업이 다른 사용자까지 느리게 만들고 그 서버가 죽는 순간 모두가 실패합니다. 이 문제들을 어떻게 풀었는지 공유합니다.

데브옵스 · 인프라 클라우드

문서 김덕원

시간이 지날수록 그동안 잘 사용했던 기반 기술들이 더 이상 최선의 선택이 아닌 순간이 오는데요. 제품을 계속 안정적으로 운영하면서 마이그레이션 또한 쉽지 않습니다. 오늘은 토스의 TUBA 팀에서는 이런 문제를 어떻게 해결했는지 소개드릴게요.

프론트엔드

문서 임재후/최수민

웹에서 복잡한 퍼널 쉽게 관리하기

문서 임재후/최수민

토스페이먼츠 프론트엔드 챕터에서 웹에서 퍼널을 손쉽게 관리하기 위해 했던 고민과 해결 방법을 공유해요.

웹 개발 프론트엔드

문서 최준우

더 안전하고 안정적인 서비스 운영을 위해서 ‘gateway’를 어떻게 사용해야 할까요? 토스의 수많은 마이크로서비스 로직을 공통화하기 위한 gateway 운영 방법에 대해 소개합니다.

백엔드 네트워크

문서 김동호

DB Connection과 Garbage Collector의 관계를 중심으로 mysql-connector-j 사용 시 발생할 수 있는 메모리 누수를 탐지하고 해결한 경험을 공유합니다.

백엔드 데이터베이스