2016-05-29 9 views
1

Ich habe eine Art Proxy-Server auf einem WebServer-Modul ausgeführt, und ich habe festgestellt, dass dieser Server wegen seines Speicherverbrauchs getötet wird.PhantomJS tötet Webserver-Client-Verbindungen nicht

Jedes Mal, wenn der Server eine neue Anfrage erhält, erstellt er einen Kind-Client-Prozess, das Problem, das ich sehe, ist, dass der Prozess auf unbestimmte Zeit am Leben bleibt.

Hier ist der Server ich verwende:

server.js

Ich dachte response.close() wurde geschlossen und Client-Verbindungen zu töten, aber es ist nicht. Hier

die Liste von Kind auf htop angezeigt Prozesse:

Processes enter image description here

(Those Prozess sind noch mehr, es ist nur ein Fragment der Liste)

ich wirklich brauchen, um Töte diese Prozesse, weil sie den gesamten freien Speicher nutzen. Fehle ich etwas?

Ich könnte den Server einfach neu starten, aber der Speicher wird immer noch verschwendet.

Vielen Dank!

EDIT:

Die Prozesse bereits erwähnt sind Threads und keine independient Prozesse, wie ich dachte (check this).

Jede http Anfrage erstellt einen neuen Thread, und das ist in Ordnung, aber dieser Thread wird nicht getötet, nachdem das Skript beendet wird.

Außerdem habe ich festgestellt, dass keine neuen Threads erstellt werden, wenn der Anfrage-Handler nicht casper (ich meine casper.run (..)) ausgeführt wird.

So werden neue Threads nur erstellt, wenn der Server eine Casper-Instanz ausführt. Das Problem ist, dass diese Instanz nicht nach der RUN-Funktion beendet wird.

Ich versuchte casper.done() wie unten erwähnt, aber es den gesamten Prozess anstelle des aktuellen laufenden Thread töten. (Ich habe für diese Funktion kein Dokument gefunden).

Wenn ich andere Casper-Skripts außerhalb des Servers auf demselben Computer ausführen, werden die instanziierten Threads und der gesamte Phantomprozess erfolgreich beendet. Was würde passieren?

Ich verwende Phantom 2.1.1 und Casper 1.1.1 Versionen.

Bitte fragen Sie mich, wenn Sie mehr oder spezifische Informationen wünschen.

Danke nochmal zum Lesen!

Antwort

1

Dies ist ein gut bekanntes Problem mit casper:

https://github.com/casperjs/casperjs/issues/1355

Es wurde von den casper Jungs nicht festgelegt worden und wird derzeit als Erweiterung gekennzeichnet. Ich denke, es ist nicht auf ihrer Prioritätenliste.

Wie auch immer, die Problemumgehung besteht darin, eine serverseitige Komponente zu schreiben, z. ein node.js-Server, der die eingehenden Anforderungen verarbeitet und für jede Anfrage ein Casper-Skript ausführt, um das Scraping in einem neuen untergeordneten Prozess durchzuführen. Dieser untergeordnete Prozess wird geschlossen, wenn casper den Job beendet. Dies ist zwar eine Problemumgehung, ist jedoch keine optimale Lösung, da die Kosten für das Öffnen eines untergeordneten Prozesses für jede Anforderung nicht niedrig sind. Es wird schwer sein, einen ähnlichen Ansatz zu skalieren. Es ist jedoch eine ausreichende Problemumgehung. Mehr zu diesem voll sinnvollen Ansatz finden Sie oben.

+0

Hallo, ich habe das versucht, aber es tötet meinen Server. Ich habe auch andere Befehle wie casper.die() versucht, aber alle enden mit dem Server. Ich habe die Frage aktualisiert. – Alstrat

+0

Welche URL verwenden Sie, um diesen Server zu testen, wenn er lokal ausgeführt wird? Ich habe das lokal ausgeführt und etwas herumgespielt, um die Logik in der process_request-Funktion zu vereinfachen, um einige Seiten zu öffnen und mit htop zu überwachen. Ich sehe nicht, dass mehrere Threads geöffnet werden. Ich teste mit einer Apache-Bank, um zu senden Anfragen gleichzeitig .. Ich sehe dieses seltsame Verhalten nicht .. Wie testen Sie diesen Server, bitte geben Sie mir eine URL, die Sie verwenden .. –

+0

Ich kann jetzt reproduzieren .. Ich komme mit einer Lösung zurück, wenn ich es herausfinden. Es ist sehr merkwürdig wie viele Threads bei jeder eingehenden Anfrage geöffnet werden .. der Server versagt schnell! –