ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ChromeDriver] close(), quit() 차이
    공부/etc 2022. 10. 3. 12:42
    반응형

     

    산학 알앤디 프로젝트 리팩토링을 하는데, 서버를 실행하면 어느 순간부터 CPU 사용량 99%, 메모리 사용량 99%를 점유하여 컴퓨터가 버벅이는 현상이 발생했다.

    그러다가 작업관리자를 실행하여 발견한 것이 이게 CPU, 메모리 99% 사용이 되는 주된 원인은 아니지만 크롬드라이버와 콘솔 창 호스트가 엄청 많이 실행되어서 메모리를 어느정도 잡아먹고 있다는 사실을 발견했다.

     

     

    왜 많이 실행이 되는 것인지 확인을 해보니 셀레니움을 사용할 때마다 새로운 크롬드라이버가 실행되고 있었고, 셀레니움을 다 사용했으면 관련된 프로그램이 전부 종료가 되어야 하지만, 크롤링할 때 사용된 크롬만 종료되고 크롬드라이버와 콘솔 창 호스트가 닫히지 않은채로 그대로 있었다.

    그래서 프로젝트에 분석 시작이라는 버튼을 클릭할 때마다 새로운 크롬드라이버, 구글 크롬, 콘솔 창 호스트가 실행되었고, 분석이 끝나면 구글 크롬만 종료되는 것이였다. 버튼을 한 번 클릭할 때마다 10.2MB 정도의 메모리 누수가 발생하고 있었고, 프로젝트에서 확인을 할 때 분석 시작 버튼을 눌러서 분석이 제대로 됐는지 확인하는 것이 주된 목표이기 때문에 해당 버튼을 한 번만 누르는 사람은 없었을 것이다.

    종료가 제대로 되는 것이 아니라서 종료하는 메서드인 close()부터 살펴보니 원인이 close()를 사용하는 것에 있었고, 분석을 시작할 때마다 새로운 크롬드라이버를 실행하고 있었으니 메모리 누수가 발생하였다.

     


    close()와 quit()의 차이점은 셀레니움을 다 사용했을 경우 어떤 방식으로 종료하는 것이냐로 생각할 수 있다.

    비유를 들자면 우리가 노트북을 다 사용할 경우 노트북을 닫게 된다. 이때 절전 모드를 사용하여 언제든지 노트북을 닫기 전 작업이 그대로 나타날 수 있도록 하는데, 이것이 크롬드라이버에서 close()를 사용하는 것이다. quit()은 전원 종료와 같다.

    즉, close()는 노트북에서 화면만 꺼두고 절전모드로 바꾸는 것이지 실제로 프로그램은 그대로 실행이 되어 있는 상태이고, quit()은 관련된 모든 프로그램을 종료하는 것이다.

     

    • close
      1. 전원 종료시 크롬 탭만 종료함
      2. 크롬 드라이버와 콘솔 창 호스트는 그대로 실행하도록 가만히 둠
      3. 싱글톤 패턴을 사용할 때 적용하는 방법
    • quit
      1. 전원 종료시 크롬드라이버와 관련된 모든 프로그램을 종료함
      2. 새로운 드라이버를 생성할 때마다 적용하는 방법

     

    현재 프로젝트에서는 크롬드라이버로 복잡한 내용을 가져오는 것이 아니기 때문에 quit을 사용하는 것으로 바꾸었지만, 복잡한 크롤링을 사용하는 프로젝트에서는 싱글톤 패턴을 사용해야 성능이 더 좋을 것 같다.

    반응형

    댓글

Designed by Tistory.