주요 콘텐츠로 건너뛰기 이 브라우저는 더 이상 지원되지 않습니다. Show 최신 기능, 보안 업데이트, 기술 지원을 이용하려면 Microsoft Edge로 업그레이드하세요. 메모리 누수 찾기
이 문서의 내용메모리 누수는 프로세스가 페이징된 풀 또는 비페이지 풀에서 메모리를 할당하지만 메모리를 해제하지 않을 때 발생합니다. 따라서 시간이 지남에 따라 이러한 제한된 메모리 풀이 고갈되어 Windows 속도가 느려집니다. 메모리가 완전히 고갈되면 오류가 발생할 수 있습니다. 섹션 내용
이 문서의 내용
Node 기반의 SSR(Server Side Rendering) 랜더링 을 서비스에 도입하다 Memory Leak 이슈를 맞이했다. Java 환경의 성능테스트를 준비하면 간혹 겪게되는 이슈이긴 한데. Node.js 도입 시작부터 memory leak 이슈가 튀어나와서 사실 당황스럽긴했다. 트래픽이 중요한 서비스다 보니 성능검증을 하지 않을 수 없었다. 보통 서버에 부하를
주게되면 최고 TPS를 찍은 후 유지된다. 요렇게.
시간이 지날수록 TPS는 떨어지고,
node instance가 사용하는 메모리도 점점 차올랐다.
힙 메모리 프로파일하기전형적인
Profile의 상세 내역을 보면 클라이언트 요청시마다 생성되는 Memory Leak 제거하기문제가 된 코드는 단 한줄의 코드였다.
express의 에러감지를 위해 적용해 놓은 sentry의 Sentry.Handlers.requestHandler 에서 Memory Leak이 발생한 것이었다. Sentry 코드의 내용을 확인해보면 Node.js의 domain 객체를 사용하는 간단한 코드로 구성되어 있다.
Node.js의 domain 객체에서 Memory Leak을 유발하는 코드가 있어서 위와 같은 문제가 발생한다. Node.js 11.10.0 릴리즈 노트를 확인하시면 domain의 Memory Leak 이슈가 해결된 커멘트를 확인해 볼 수 있다.
결과적으로는 Request Header 정보는 서비스 오류, 장애 대응에 크게 문제가 되지 않기에 Express의 Sentry 탐침 코드를 제거하였다.
결론1. Sentry를 사용한다면...
2. node.js 11.10.0 미만 버전에서 domain 객체를 사용하지 않는다.
|