[PYTHON] Antwort auf das Problem der Überbeanspruchung des Splash-Speichers (Entwurf)

Ich hatte nicht erwartet, dass der Adventskalender in unserem Labor sicher endet. Dieses Mal werde ich über Splashs Speicherproblem schreiben.

Fazit

** Wenn Sie zu viel Speicher essen, wird es ohne Erlaubnis fallen, also starten Sie neu **

Was ist das

Ich habe vor [Scrapy is good] einen Artikel geschrieben (https://qiita.com/marutaku0131/items/3da0b0870cb0a2bd4244). Aber Scrapy hat ein Problem. Das heißt natürlich, JavaScript funktioniert nicht. Ein Tool namens Splash wird häufig beim Scraping von Seiten verwendet, die JavaScript mit Scrapy verwenden.

Splash ist ein Server, der JavaScript rendert. Sie können die Quelle nach dem Ausführen von JavaScript der angegebenen Site abrufen, indem Sie über die Web-API darauf zugreifen. Der Inhalt ist in Python geschrieben und scheint Twisted und QT3 zu verwenden.

Problem

Solch ein praktischer Splash hat ein großes Problem. Es verbraucht viel Speicher. Die folgende Abbildung zeigt den Speicherverbrauch von Splash. Image from Gyazo Je mehr Anfragen Sie stellen, desto mehr Speicher wird verbraucht. In diesem Zustand verschwindet der Speicher, egal wie viel Speicher geladen ist, im Handumdrehen. Es gibt ein ähnliches Problem bei Github, aber es scheint, dass die Python-Spezifikation keinen freien Speicher zulässt. https://github.com/scrapinghub/splash/issues/674

Lösung

Das Problem mit Python ist unantastbar. Wenn jemand weiß, lassen Sie es mich bitte wissen. Wie in der obigen Ausgabe erwähnt, besteht die einzige Möglichkeit, Speicher freizugeben, darin, Splash einmal zu löschen. Splash kann jedoch nicht manuell gelöscht werden, daher muss es automatisch gelöscht werden. Es ist eine Ameise, ein Skript zu schreiben, wie jede Minute mit cron neu zu starten, aber es ist mühsam. Was soll ich in einem solchen Fall tun?

** Warten Sie, bis es aufgrund von Speichermangel herunterfällt. Und lassen Sie uns automatisch neu starten **

Es ist keine sehr intelligente Lösung, aber die einfachste.

was ist zu tun

Zielen Sie auf die folgenden Situationen ab.

Legen Sie zunächst die Obergrenze des Speichers fest, den der Docker-Container von Splash verwenden kann. Verwenden Sie für Docker-Compose 2, da "mem_limit" aus Version 3 verschwunden ist. Fügen Sie außerdem "Neustart: Immer" hinzu, damit es automatisch neu startet, wenn es fällt.

version: "2"
services: 
    splash:
        image: "scrapinghub/splash:3.3"
        ports: 
            - "8050:8050"
        mem_limit: 2g
        restart: always
        command: --disable-browser-caches --maxrss 4000

Jetzt essen Sie nicht mehr Speicher als Sie brauchen.

Am Ende

Wie ich in der Mitte sagte, ist es keine sehr kluge Lösung. Bitte lassen Sie mich wissen, ob es einen intelligenteren und einfacheren Weg gibt.

Referenzierte Site

Recommended Posts

Antwort auf das Problem der Überbeanspruchung des Splash-Speichers (Entwurf)
Antwort auf "Offline in Echtzeit, wie man ein F04-Problem schreibt"
Antwort auf "Offline in Echtzeit, wie man ein F05-Problem schreibt"
Antwort auf "Offline in Echtzeit, wie man ein E12-Problem schreibt"
Antwort auf "Offline in Echtzeit, wie man ein F02-Problem schreibt"
Antwort auf "Offline-Echtzeit, wie man ein F01-Problem schreibt"
Antwort auf "Offline-Echtzeit, wie man ein E13-Problem schreibt"
[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen