Ich hatte nicht erwartet, dass der Adventskalender in unserem Labor sicher endet. Dieses Mal werde ich über Splashs Speicherproblem schreiben.
** Wenn Sie zu viel Speicher essen, wird es ohne Erlaubnis fallen, also starten Sie neu **
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.
Solch ein praktischer Splash hat ein großes Problem. Es verbraucht viel Speicher. Die folgende Abbildung zeigt den Speicherverbrauch von Splash. 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
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.
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.
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.
Recommended Posts