Splash 메모리 사용량 문제의 답변 (안)

저희 연구실의 어드벤트 캘린더 설마 무사하게 끝난다고는 생각하지 않았습니다.
이번에는 Splash의 메모리 문제에 대해 씁니다.

결론



메모리를 너무 많이 먹으면 마음대로 떨어지기 때문에 재부팅

이것은 무엇인가



이전에 Scrapy는 좋다. 라고 기사를 썼습니다. 그러나 Scrapy에는 한 가지 문제가 있습니다. 당연히 자바 스크립트가 작동하지 않는다는 것입니다. JavaScript를 사용하는 페이지를 Scrapy로 스크레이핑할 때 자주 사용하는 것이 Splash 라는 툴입니다.

Splash는 JavaScript를 렌더링하는 서버로 WebAPI를 사용하여 액세스하여 지정한 사이트의 JavaScript 실행 후 소스를 얻을 수 있습니다. 내용은 Python으로 작성되었으며 Twisted와 QT3을 사용하는 것 같습니다.

문제



그런 편리한 Splash입니다만, 하나 큰 문제가 있습니다. 그것은 메모리를 엄청나게 소비하는 것입니다.
아래 그림은 Splash 메모리 소비량의 그래프입니다.

요청을 할수록 소비하는 메모리가 늘어납니다. 이 상태에서는 아무리 메모리를 쌓아도 순식간에 없어져 버립니다.
Github에도 비슷한 Issue가 서 있지만 Python 사양으로 메모리를 해제 할 수없는 것 같습니다.
htps : // 기주 b. 코 m/sc라핀 g후 b/sp㎁sh/이스에 s/674

해결책



파이썬의 문제는 유석에 손이 닿지 않습니다. 아는 사람이 있으면 알려주세요.
위의 Issue에도 쓰여진 것처럼 메모리를 해제하려면 한 번 Splash를 떨어뜨리는 것 외에는 방법이 없습니다. 다만, Splash를 수동으로 떨어뜨릴 수는 없기 때문에 자동으로 떨어뜨릴 필요가 있습니다. cron등으로 1분마다 재기동 같은 스크립트를 쓰는 것도 개미입니다만 귀찮습니다. 그럴 때 어떻게 하면 좋을까.

메모리 부족으로 떨어질 때까지 기다리자. 그리고 자동으로 다시 시작합시다.

별로 머리가 좋은 해결책은 아니지만 이것이 가장 편합니다.

어떻게 할까



다음과 같은 상황을 대상으로 합니다.
  • Splash는 Docker에서 움직이고 있습니다
  • docker-compose를 사용하고 있습니다

  • 먼저 Splash의 Docker 컨테이너가 사용할 수 있는 메모리의 상한을 설정합니다. docker-compose는 version3에서 mem_limit가 없어졌으므로 2를 사용합니다.
    또, 떨어졌을 때에 자동으로 재기동하도록(듯이) restart:always (을)를 붙여 줍니다.
    version: "2"
    services: 
        splash:
            image: "scrapinghub/splash:3.3"
            ports: 
                - "8050:8050"
            mem_limit: 2g
            restart: always
            command: --disable-browser-caches --maxrss 4000
    

    이제 메모리를 필요 이상으로 먹는 일이 없어졌습니다.

    끝에



    도중에도 말했듯이 그다지 머리가 좋은 해결책은 아닙니다. 더 현명하고 편안하게 할 수있는 방법이 있다면 알려주십시오.

    참고로 한 사이트


  • htps : // sp sh. Red d. cs. 이오/엔/s타 bぇ/후아 q. html # How-To-Run-sp
  • htps : // 레보오오 t. 네 t/포 st/호 w-와 s 페시 fy 메 m ぃ 미 t 온-c c r/

  • 좋은 웹페이지 즐겨찾기