Zu viele offene Dateien (Selen + PhantomJSDriver)

9

In meinem eingebetteten Selenium / PhantomJSDriver-Treiber scheint es, dass Ressourcen nicht bereinigt werden. Das synchrone Ausführen des Clients verursacht Millionen von geöffneten Dateien und löst schließlich eine Ausnahme vom Typ "Zu viele Dateien öffnen" aus.

Hier ist eine Ausgabe, die ich von lsof gesammelt habe, während das Programm für ~ 1 Minute läuft

%Vor%

Ich verstehe nicht, warum die Verwendung des -p Flags auf lsof eine kleinere Ergebnismenge hat. Aber es scheint, dass die meisten Einträge pipe und anon_inode sind.

Der Client ist in ~ 100 Zeilen sehr einfach und ruft am Ende der Verwendung driver.close() und driver.quit() auf. Ich habe mit dem Caching und der Wiederverwendung von Clients experimentiert, aber es hat die geöffneten Dateien nicht gelindert.

%Vor%

Ich habe mehrere Versionen von Selenium ausprobiert, falls es einen Bugfix gab. Die Datei build.sbt:

%Vor%

Außerdem habe ich PhantomJS 2.0.1 und 2.1.1:

ausprobiert %Vor%

Ist das ein PhantomJS- oder Selen-Problem? Verwendet mein Client die API nicht ordnungsgemäß?

    
nkconnor 02.01.2017, 14:34
quelle

2 Antworten

3

Die Ressourcennutzung wird durch BrowserMob verursacht. Um den Proxy zu schließen und seine Ressourcen zu bereinigen, muss man stop() aufrufen.

Für diesen Client bedeutet das, die Methode shutdown zu ändern

%Vor%

Eine andere Methode, abort , bietet eine sofortige Beendigung des Proxy-Servers und wartet nicht darauf, dass der Verkehr aufhört.

    
nkconnor 12.01.2017, 19:16
quelle
0

Meiner Meinung nach scheint es ein Problem von PhantomJS zu sein. Sie können die folgenden Alternativen ausprobieren:

  1. Verwenden Sie phantomjs 2.5.0-beta . Es wurde kürzlich veröffentlicht. Ich bin mir nicht sicher, ob dieses Upgrade Ihr Problem löst, aber es ist zumindest einen Versuch wert. Laut Changelog sind die neuen Features dieser Version:

    • Aktualisieren Sie QtWebKit auf QtWebKitNG
    • Upgrade von Qt auf 5.7.1
  2. Bereinige die phantomjs-Prozesse nach dem Schließen des Webdrivers. Sie können Ihren eigenen Cleaner implementieren, um zu erzwingen, dass phantomjs nach driver.close() (Aufruf von killall -9 phantomjs oder ähnlich) tatsächlich geschlossen wird.

Boni García 10.01.2017 10:52
quelle