HAProxy-Neuladen - alte Prozesse wurden nie beendet

15

Ich habe HAProxy-Setup im TCP-Modus mit Client / Server / Connect-Timeout von 120s.

Wenn ich die Konfiguration zu schnell neu lade, habe ich manchmal mehrere Prozesse. Dies wird vom Entwurf her erwartet, sodass alle bestehenden Verbindungen entleert werden.

Mein Problem ist, dass sie nie beendet werden, obwohl alle Verbindungen geschlossen sind.

ps aux | Haproxy

    haproxy  12483  0.0  0.1 103748  1084 ?        Ss   20:45   0:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf 12405
    haproxy  12485  0.0  0.1 103748  1088 ?        Ss   20:45   0:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf 12405
    haproxy  12487  0.0  0.1 103748  1084 ?        Ss   20:45   0:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf 12405
    haproxy  25115  0.0  0.1 103748  1084 ?        Ss   21:26   0:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf 12488

netstat -pant | grep haproxy

tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      25115/haproxy
    tcp        0      0 0.0.0.0:1936                0.0.0.0:*                   LISTEN      25115/haproxy
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      25115/haproxy

Ich habe länger als 120 Sekunden gewartet. Ich verstehe nicht, was sie hält.

Die folgenden Beispiele für einen dieser alten Prozesse zeigen, dass es für TCP LISTEN noch einige FDs gibt

# lsof -p 12483
COMMAND   PID    USER   FD   TYPE  DEVICE SIZE/OFF   NODE NAME
haproxy 12483 haproxy  cwd    DIR   202,1     4096      2 /
haproxy 12483 haproxy  rtd    DIR   202,1     4096      2 /
haproxy 12483 haproxy  txt    REG   202,1  4381869 412355 /usr/local/sbin/haproxy
haproxy 12483 haproxy  mem    REG   202,1    62864 396140 /lib64/libnss_files-2.17.so
haproxy 12483 haproxy  mem    REG   202,1   126288 396526 /usr/lib64/libselinux.so.1
haproxy 12483 haproxy  mem    REG   202,1   141760 396148 /lib64/libpthread-2.17.so
haproxy 12483 haproxy  mem    REG   202,1    89312 396076 /lib64/libgcc_s-4.8.2-20140120.so.1
haproxy 12483 haproxy  mem    REG   202,1    98720 396150 /lib64/libresolv-2.17.so
haproxy 12483 haproxy  mem    REG   202,1    13224 396957 /lib64/libkeyutils.so.1.5
haproxy 12483 haproxy  mem    REG   202,1    43768 396966 /lib64/libkrb5support.so.0.1
haproxy 12483 haproxy  mem    REG   202,1    19512 396128 /lib64/libdl-2.17.so
haproxy 12483 haproxy  mem    REG   202,1   170784 396962 /lib64/libk5crypto.so.3.1
haproxy 12483 haproxy  mem    REG   202,1    12744 396594 /usr/lib64/libcom_err.so.2.1
haproxy 12483 haproxy  mem    REG   202,1   937952 396964 /lib64/libkrb5.so.3.3
haproxy 12483 haproxy  mem    REG   202,1   273672 396958 /lib64/libgssapi_krb5.so.2.2
haproxy 12483 haproxy  mem    REG   202,1   486512 396073 /lib64/libfreebl3.so
haproxy 12483 haproxy  mem    REG   202,1  2000552 396122 /lib64/libc-2.17.so
haproxy 12483 haproxy  mem    REG   202,1  1967496 400756 /lib64/libcrypto.so.1.0.1j
haproxy 12483 haproxy  mem    REG   202,1   445424 400761 /usr/lib64/libssl.so.1.0.1j
haproxy 12483 haproxy  mem    REG   202,1    88568 396529 /lib64/libz.so.1.2.7
haproxy 12483 haproxy  mem    REG   202,1    36856 396126 /lib64/libcrypt-2.17.so
haproxy 12483 haproxy  mem    REG   202,1   152376 396115 /lib64/ld-2.17.so
haproxy 12483 haproxy    0u  0000     0,9        0   5420 anon_inode
haproxy 12483 haproxy    4u  IPv4 1435667      0t0    TCP *:http (LISTEN)
haproxy 12483 haproxy    5u  IPv4 1435668      0t0    TCP *:https (LISTEN)
haproxy 12483 haproxy    6u  IPv4 1435673      0t0    TCP *:jetcmeserver (LISTEN)
Bastien974
quelle
Hmm, also besitzt der alte Prozess immer noch den Hörer, wie er aussieht? Was bevölkert die -sfin Ihrer Konfiguration? Auf den neueren Prozess wird verwiesen -sf 12488(und er 12488wird nicht ausgeführt), aber es sieht so aus, 12483als müsste er verwiesen werden , um den Listener erfolgreich zu führen.
Shane Madden
A strace -p 13483kann hilfreich sein, um zu zeigen, was dieser Prozess tut (oder blockiert ist usw.).
Wurtel
ShaneMadden , alle Prozesse besitzen Listener, aber nur der letzte Prozess hört TCP wirklich (basierend auf netstat). Der Prozess 12488 existiert nicht mehr, er wurde irgendwie abgebrochen. Wurtel , Strace zeigt die Wiederholung von:gettimeofday({1417009573, 706535}, NULL) = 0 gettimeofday({1417009573, 706629}, NULL) = 0 epoll_wait(0, {}, 200, 1000)
Bastien974
@ Bastien974 Konnten Sie die Lösung des Problems herausfinden. Ich sehe das gleiche Problem.
Pradeepchhetri

Antworten:

1

Das ist mir auch erst vor ein paar Tagen passiert ... Keine vernünftige Antwort, wahrscheinlich wurde der Prozess nie beendet, da die Verbindungen ihn immer noch verwenden. Ich habe 2 HaProxys und diese Situation ist in der zweiten nie aufgetreten, da sie im normalen Betrieb keine Verbindungen hat.

Ich gab einen SIGTERM Befehl, oder Sie können einfach KILL die alte PID und Sie sind in Ordnung.

Sie können die alte PID einfach von der HaProxy-Statusseite abrufen . Mehrmals erfrischend sah ich zufällig den alten und den neuen Prozess.

Nach dem Töten des alten Prozesses reagierte nur der neue auf die Anfragen.

:)

Iñigo in der Wolke
quelle