HAProxy reload - proses lama tidak pernah dihentikan

15

Saya memiliki pengaturan HAProxy dalam mode TCP, dengan batas waktu klien / server / koneksi 120an.

Ketika saya memuat ulang konfigurasi terlalu cepat, saya kadang berakhir dengan beberapa proses. Secara desain, ini diharapkan, sehingga semua koneksi yang ada terkuras.

Masalah saya adalah mereka tidak pernah putus, meskipun semua koneksi ditutup.

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 | grap 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

Saya menunggu lebih lama dari batas waktu 120-an. Saya tidak mengerti apa yang menahan mereka.

Lsof berikut untuk salah satu dari proses lama menunjukkan bahwa masih ada beberapa FD untuk TCP LISTEN

# 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
sumber
Hmm, jadi proses yang lama masih memiliki pendengar? Apa yang mengisi -sfdalam konfigurasi Anda? Proses yang lebih baru diarahkan ke -sf 12488(dan 12488tidak berjalan), tetapi sepertinya 12483adalah yang harus diarahkan untuk mengambil pendengar dengan sukses.
Shane Madden
A strace -p 13483mungkin membantu dalam menunjukkan apa yang sedang dilakukan proses itu (atau diblokir, dll.).
Wurtel
ShaneMadden , semua proses memiliki pendengar, tetapi hanya proses terakhir yang benar-benar mendengarkan TCP (berdasarkan netstat). Proses 12488 tidak ada lagi, entah bagaimana dihentikan. wurtel , strace menunjukkan pengulangan:gettimeofday({1417009573, 706535}, NULL) = 0 gettimeofday({1417009573, 706629}, NULL) = 0 epoll_wait(0, {}, 200, 1000)
Bastien974
@ Bastien974 Apakah Anda dapat menemukan solusi masalah. Saya melihat masalah yang sama.
pradeepchhetri

Jawaban:

1

Ini terjadi pada saya juga beberapa hari yang lalu ... Tidak ada jawaban yang masuk akal, mungkin, prosesnya tidak pernah selesai karena koneksi masih menggunakannya setiap saat. Saya memiliki 2 HaProxy dan, situasi ini tidak pernah terjadi pada yang sekunder karena tidak memiliki koneksi selama operasi normal.

Saya mengeluarkan perintah SIGTERM , atau Anda bisa MEMBUNUH PID yang lama dan Anda baik-baik saja.

Anda bisa mendapatkan PID lama dari halaman status HaProxy . Menyegarkan beberapa kali saya melihat proses lama dan baru secara acak.

Setelah membunuh yang lama, proses baru adalah satu-satunya yang menanggapi permintaan.

:)

Iñigo InThe Cloud
sumber