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
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.
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äß?
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
Eine andere Methode, abort
, bietet eine sofortige Beendigung des Proxy-Servers und wartet nicht darauf, dass der Verkehr aufhört.
Meiner Meinung nach scheint es ein Problem von PhantomJS zu sein. Sie können die folgenden Alternativen ausprobieren:
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:
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.
Tags und Links scala java selenium selenium-webdriver phantomjs