2015-06-01 16 views
8

Ich habe einen Laravel-Warteschlange Job namens "Webhooks" mit Beanstalkd und Supervisord auf meinem Ubuntu-Server. Ich kann sehen, dass der Job ordnungsgemäß mit der Prozess-ID 4403 läuft:Laravel-Warteschlange mit Supervisord zu viele FIFO-Dateien öffnen

webhooks       RUNNING pid 4403, uptime 4 days, 19:47:01 

Wie Sie sehen können, hat dieser Job seit 4 Tagen ausgeführt. In meinem Fehlerprotokoll, begann ich erscheinen die folgenden Fehler zu bemerken:

error:02001018:system library:fopen:Too many open files 

Als ich lief lsof | php, um zu sehen, welche Dateien geöffnet waren, bemerkte ich eine Tonne von Dateien geöffnet, die Art FIFO hatten. Hier ist ein Experte aus der Ausgabe:

COMMAND  PID TID  USER FD  TYPE    DEVICE SIZE/OFF  NODE NAME  
php  4403    root 0r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 1w  FIFO    0,8  0t0 9215812 pipe 
php  4403    root 2w  FIFO    0,8  0t0 9215812 pipe 
php  4403    root 3w  FIFO    0,8  0t0 9215812 pipe 
php  4403    root 4w  FIFO    0,8  0t0 9215812 pipe 
php  4403    root 8r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 9r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 10r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 11r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 12r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 13r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 14r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 15r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 16r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 17r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 18r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 19r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 20r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 21r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 22r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 23r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 24r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 25r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 26r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 27r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 28r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 29r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 30r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 31r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 32r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 33r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 34r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 35r  FIFO    0,8  0t0 9215811 pipe 
php  4403    root 36r  FIFO    0,8  0t0 9215811 pipe 

Dies ist nur ein Auszug. Es sind tatsächlich rund 1200 dieser FIFO Dateien geöffnet.

Weiß jemand, was verursacht die Dateien erstellt werden? Welche Arten von Code würden dazu führen, dass das System eine neue FIFO-Datei öffnet? Wofür werden diese Dateien verwendet?

+0

Eine schnelle Google lässt Sie wissen, dass FIFO-Dateien Named Pipes sind. Etwas in deinem Skript oder in Supervisord erzeugt diese Pfeifen. Sehen Sie sich im PHP-Handbuch die Named Pipes an und schauen Sie, ob Sie den Code, der die Pipes erzeugt, nicht aufspüren können. – Styphon

+0

Wissen Sie, welche Codearten dazu führen können, dass das System Named Pipes erstellt? Ich weiß, dass das eine breite Frage ist, aber ich bin mir nicht sicher, wo ich anfangen soll. Der laufende Code synchronisiert Objekte zwischen meinem internen System und einem externen System, das die BigCommerce-API mit ihrem [PHP SDK] verwendet (https://github.com/bigcommerce/bigcommerce-api-php). Daher werden ständig Informationen aus BigCommerce gepusht und abgerufen. Zuvor habe ich zu viele Verbindungen geöffnet, was dazu führte, dass zu viele offene Dateifehler auftraten, aber das ist nun behoben und dieses FIFO-Problem hat seinen Platz eingenommen. – flyingL123

+0

Nicht vertraut mit Bohnenstange oder Supervisord, aber ich persönlich würde beginnen durch [Suche in Ihrem Code-Basis] (https://github.com/ggreer/the_silver_searcher) für 'proc_open' oder' mkfifo'. – bishop

Antwort

0

Ich endete am Öffnen der Datei auf meinem System, und das scheint das Problem behoben zu haben. Die Supervisor docs sagt, dass:

supervisord zügig Filedeskriptoren verwendet und wird einen Fehler Modus, wenn man nicht von dem O erhalten werden kann meine Datei öffnen Grenze zu 10.000

Nach Erhöhung, ich habe Der Fehler wurde nicht mehr angezeigt. Ich überprüfe periodisch die Anzahl der geöffneten FIFO-Dateien, und es gibt Zeiten, in denen es sehr hoch ist (zu Tausenden) und zu anderen Zeiten ist es viel niedriger (zu Hunderten). Es sieht also so aus, als würde der Supervisor diese Dateien ständig öffnen und schließen, und ich musste nur sicherstellen, dass das System dem Supervisor genügend Platz für seine Arbeit lässt.

Falls jemand sich fragt, habe ich das Dateilimit erhöht, indem ich die folgenden zwei Zeilen am Ende von /etc/security/limits.conf hinzugefügt habe.

root    soft nofile   10000 
root    hard nofile   10000 

Ich hatte Supervisor neu zu starten sowie Log-in und aus meinem System ein paar Mal, bevor die neue Grenze in Kraft getreten ist, aber es funktionierte schließlich.