2015-06-01 20 views
8

Używam zadania kolejki Laravel o nazwie "webhooks" za pomocą beanstalkd i supervisord na moim serwerze Ubuntu. Widzę, że praca prawidłowo działa z identyfikatorem procesu 4403:Kolejka Laravel z supervisorem otwierającym zbyt wiele plików FIFO

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

Jak widać, zadanie to działa przez 4 dni. W moich dzienników błędów, zacząłem dostrzegać następujący błąd pojawiający:

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

Kiedy wpadłem lsof | php, aby zobaczyć jakie pliki były otwarte, zauważyłem mnóstwo otwartych plików, które miały typ FIFO. Oto ekspert od wyjścia:

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 

To tylko fragment. W rzeczywistości jest około 1200 z tych plików FIFO otwartych.

Czy ktoś wie, co powoduje tworzenie plików? Jakie rodzaje kodu spowodowałyby, że system otworzyłby nowy plik FIFO? Do czego służą te pliki?

+0

Szybkie Google informuje, że pliki FIFO są nazwane potokami. Coś w twoim scenariuszu lub w superwizorze tworzy te rury. Zajrzyj do nazwanych potoków w podręczniku PHP i zobacz, czy nie możesz wyśledzić kodu tworzącego rury. – Styphon

+0

Czy wiesz, jakie rodzaje kodu mogą spowodować, że system utworzy nazwane potoki? Wiem, że to szerokie pytanie, ale nie jestem pewien, od czego zacząć. Działający kod synchronizuje obiekty między moim systemem wewnętrznym a systemem zewnętrznym za pomocą interfejsu API Bigcommerce za pomocą ich [PHP SDK] (https://github.com/bigcommerce/bigcommerce-api-php). Dlatego ciągle przesuwa i wyciąga informacje z BigCommerce. Poprzednio otwierałem zbyt wiele połączeń, powodując zbyt dużą liczbę otwartych błędów w plikach, ale zostało to rozwiązane i ten problem FIFO zajął jego miejsce. – flyingL123

+0

Nie jestem zaznajomiony ani z beanstalkd ani superwordorem, ale osobiście zacznę od [przeszukiwania twojej bazy kodu] (https://github.com/ggreer/the_silver_searcher) dla 'proc_open' lub' mkfifo'. – bishop

Odpowiedz

0

Skończyło się zwiększenie otwartego limitu plików w moim systemie i wydaje się, że naprawiłem problem. Docs supervisor powiedzieć, że:

supervisord używa deskryptorów liberalnie, i wejdzie w tryb awarii gdy nie można uzyskać z systemu operacyjnego

Po zwiększeniu mój plik otwarty limitu do 10.000, mam przestałem widzieć błąd. Okresowo sprawdzam liczbę otwartych plików FIFO, a czasami są bardzo wysokie (w tysiącach), a czasami jest znacznie niższy (w setkach). Wygląda na to, że nadzorca otwiera i zamyka te pliki w sposób ciągły, a ja po prostu musiałem upewnić się, że system pozwala nadzorcy na wystarczającą ilość miejsca do wykonania swojej pracy.

Jeśli ktoś się zastanawia, zwiększyłem limit plików, dodając następujące dwie linie na końcu /etc/security/limits.conf.

root    soft nofile   10000 
root    hard nofile   10000 

musiałem zrestartować przełożonego, jak również zalogować się i z mojego systemu kilka razy, zanim weszła w życie nowa granica, ale w końcu się udało.