memory profiler 사용해서 메모리 문제 해결하기

@kimdongwoo · July 01, 2022 · 4 min read

들어가며

  • 회사에서 영상 분석을 위해 내부적으로 만들어진 라이브러리를 사용하다가, 특정 상황에서 사용이 중단되는 현상애 맞닥뜨렸다.
  • 어느 날, 대량 작업을 위해 새벽동안 서버에서 실행해두면 출근하고 보니 어느순간에선가 프로그램이 멈춰있는 것이다.
  • 분명 전날까지도 전사적으로 잘 사용하던 라이브러리이고, 본인도 매일같이 사용하며 별다른 에러를 보지 못했다.
  • 당일까지도 나를 제외하고 나머지 분들은 잘 쓰고 있었다. 무작정 버그 리포트를 하기도 난감한 상황이였다.
  • 몇번의 재작동을 해보니 항상 카운트가 900대에서 멈췄다. 그래서 몇가지 추측을 해보았다.

      1. 특정 영상이 들어간 경우 오류를 내뿜는다.
      1. 너무 오랜 시간동안 작동하여 에러가 난다.
  • 특정 영상이 들어간 경우 문제가 발생하는 경우가 종종 있었기에 해당 영상을 넘어가도록 총 2만개 되는 영상중에 앞 2000개를 건너뛰도록 해보았다. 그런데도 동일하게 900몇번째에서 프로그램이 작동을 멈추었다.
  • 램 문제를 의심하게 되었고, 프로그램을 작동 후 htop로 확인해보니 놀라운 상황을 볼 수 있었다. 시간이 지나면 지날수록 램 사용량이 수직 상승하는 것을 볼 수 있었다.
  • 분명 어디선가 메모리 누수가 일어나고 있다.

해결 과정

  • 메모리 프로파일러를 설치하였다.
  • 가장 상위 실행 부분부터 (함수를 실행하는 일종의 메인함수 부분) 메모리 프로파일링을 실시하였다.

    • for 이터레이션마다 메모리가 해제되지 않고 계속 상승하는 것을 볼 수 있었다.
  • 점점 의심이 가는 부분으로 좁혀가며 메모리 프로파일링을 진행하였다.
  • 이미지 분석을 위한 pytorch model을 load 하는 과정이 loop안에 있던 것을 볼 수 있었다.

왜 특정 상황에서만 에러가 생겼나?

  • 평소에는 shell code로 1개 파일 내지는 1개 디랙토리만 검사하였기 때문에 메모리 누수가 눈에 띄지 않았다.
  • 심지어 실행 환경의 메모리가 상당히 넉넉하여 웬만한 경우에는 메모리 부족으로 프로그램이 중단되는 경우까지 가지는 않았다.
  • 하지만 대량 작업을 위해 해당 모듈을 import 하여 loop 안에서 실행하다보니 실행시마다 모델을 load 하게 되었고, 일정 이상 메모리에 과도하게 쌓여 시스템 전체에 에러를 발생하게 되었다.

배운점

  • 프로그램 작동이 특정 조건에서 에러를 낸다면 램 누수를 의심해볼 필요가 있다.
  • DI 의 필요성 or 싱글톤의 필요성. 외부에서 model을 load하고 injection 하게 했다면 생기지 않았을 것이다.

    • 아니면 모델을 불러오는 객체를 싱글톤으로 작성했다면 좋았을 것이다.

참고자료

@kimdongwoo
세상과 다른 방법으로 살고싶습니다.