서비스가 점점 느려지는 이유, 보이지 않는 버그 ‘메모리 누수’ 찾기

“우리 서비스가 처음에는 빨랐는데, 오픈하고 며칠 지나니까 점점 느려지는 것 같아요.”

“서버를 재부팅하면 잠시 괜찮아졌다가, 시간이 지나면 또다시 느려집니다.”

이런 미스터리한 성능 저하 현상을 겪고 있다면, 그 원인은 바로 ‘메모리 누수(Memory Leak)’일 가능성이 높습니다.

‘메모리 누수’는 조용히, 그리고 서서히 시스템을 병들게 만드는 보이지 않는 버그입니다.

Q. ‘메모리 누수(Memory Leak)’, 정확히 무엇인가요?

‘메모리 누수’는 프로그램이 시스템으로부터 할당받은 ‘메모리’를, 사용이 끝난 후에도 제대로 반환하지 않고 계속 점유하고 있는 현상을 말합니다.

  • 비유:
    • 식당에서 손님이 식사를 마치고 떠났는데, 직원이 그 테이블을 치우지 않고 계속 ‘사용 중’ 상태로 두는 것과 같습니다.
    • 이런 ‘치워지지 않은 테이블’이 점점 쌓이면 어떻게 될까요?
    • 나중에는 새로운 손님을 받을 수 있는 자리가 부족해져, 식당 전체가 마비될 것입니다.

마찬가지로, ‘메모리 누수’가 계속해서 쌓이면 시스템은 결국 가용 메모리가 부족해집니다.

그 결과, 시스템 속도가 현저히 느려지거나 최악의 경우 서버가 멈추는(Crash) 현상이 발생합니다.

Q. ‘메모리 누수’는 왜 발생하나요?

주로 개발자가 코드를 작성할 때의 실수로 인해 발생합니다.

최신 프로그래밍 언어(Java, Python 등)들은 ‘가비지 컬렉션(Garbage Collection)’이라는 기능이 있습니다.

이 기능은 프로그램이 더 이상 사용하지 않는 메모리를 자동으로 찾아내어 정리해 주는 똑똑한 청소부 역할을 합니다.

하지만, 개발자가 코드 어딘가에 더 이상 필요 없는 데이터(객체)에 대한 연결 고리(참조)를 남겨두면 문제가 생깁니다.

가비지 컬렉터는 이 연결 고리를 보고, “아, 이 데이터는 아직 사용 중이구나”라고 착각하여 메모리를 정리하지 못합니다.

이런 작은 실수들이 계속해서 쌓여 심각한 ‘메모리 누수’로 이어집니다.

Q. QA는 이 찾기 힘든 ‘메모리 누수’를 어떻게 테스트할 수 있나요?

‘메모리 누수’는 일반적인 기능 테스트처럼 짧은 시간 안에 발견하기는 거의 불가능합니다.

‘시간’을 두고 시스템의 상태를 꾸준히 관찰하는 ‘성능 테스트’ 기법이 필요합니다.

  • 1. 내구성 테스트 (Soak / Endurance Testing):
    • ‘메모리 누수’를 발견하는 가장 대표적인 방법입니다.
    • 시스템에 실제 사용 환경과 유사한 수준의 부하를 가하면서, 8시간, 24시간 등 ‘장시간’ 동안 멈추지 않고 운영합니다.
    • 이 시간 동안, 메모리 사용량을 1분 또는 5분 단위로 계속해서 모니터링합니다.
    • 만약 테스트 시작 시점보다 시간이 지남에 따라 메모리 사용량이 눈에 띄게, 그리고 꾸준히 증가하는 ‘우상향 그래프’를 그린다면, ‘메모리 누수’를 강력하게 의심할 수 있습니다.
  • 2. 프로파일링 도구 (Profiling Tools) 활용:
    • 개발자와 협력하여, VisualVM(Java), cProfile(Python)과 같은 ‘메모리 프로파일링’ 도구를 사용합니다.
    • 이 도구들은 현재 메모리를 어떤 객체들이, 얼마나 차지하고 있는지 상세하게 보여줍니다.
    • QA는 특정 기능(예: ‘대용량 파일 업로드’)을 반복적으로 수행하면서, 프로파일링 도구의 메모리 변화를 관찰합니다.
    • 특정 객체의 수가 비정상적으로 계속 늘어나는 것을 발견하면, 이를 개발자에게 전달하여 ‘메모리 누수’의 원인을 찾는 데 결정적인 단서를 제공할 수 있습니다.

Q. ‘메모리 누수’를 발견했을 때, QA는 어떻게 보고해야 하나요?

일반 버그 리포트보다 더 상세한 데이터와 재현 시나리오가 필요합니다.

  • 필수 포함 정보:
    • 정확한 재현 시나리오:
      • 어떤 기능이나 행동을 ‘얼마나 오래’, 또는 ‘몇 번 반복’했을 때 메모리가 증가했는지 명확하게 기술합니다.
    • 객관적인 모니터링 데이터:
      • 시간에 따른 메모리 사용량 증가를 보여주는 그래프나 수치를 스크린샷으로 첨부합니다.
    • 프로파일링 결과 (가능하다면):
      • 메모리를 비정상적으로 많이 차지하는 것으로 의심되는 객체나 클래스의 이름을 개발자에게 전달합니다.
    • 테스트 환경 정보:
      • 테스트가 수행된 서버의 사양과 설정 정보를 상세히 포함합니다.

결론: 장기적인 안정성을 지키는 파수꾼

‘메모리 누수’는 눈에 잘 띄지 않지만, 장기적으로 서비스의 안정성을 좀먹는 심각한 버그입니다.

QA가 ‘성능 테스트’의 한 종류인 ‘내구성 테스트’와 ‘모니터링’에 대한 이해를 갖출 때, 비로소 이런 숨겨진 문제들을 찾아낼 수 있습니다.

‘메모리 누수’를 찾아내고 분석하는 과정은 QA의 기술적 깊이를 한 단계 끌어올리고, 서비스의 장기적인 안정성에 크게 기여하는 매우 가치 있는 활동입니다.

참고 자료 (References)

댓글 남기기