haproxy 在脚本结束之前终止外部检查进程

haproxy 在脚本结束之前终止外部检查进程

我有一个运行 haproxy:2.8-lts 的 docker 容器,它会对后端进行检查,但我的脚本在完成之前就被终止了,导致检查失败,同时积累了大量进程。查看日志,我看到以下内容:

+ not_used_1=NOT_USED
+ not_used_2=NOT_USED
+ host=18.138.80.239
+ port=443
++ /usr/local/bin/te-ping 18.138.80.239 -p 443 -c 50
++ /usr/bin/awk '/packet loss/ { print strtonum($6) }'
[WARNING]  (101890) : kill 103391
[WARNING]  (1) : Process 103392 exited with code 141 (Broken pipe)

仔细观察正在产生的进程,我发现:

root           1  0.3  0.1  90656 10240 ?        Ss   08:47   0:00 haproxy -W -db -f /etc/haproxy/haproxy.cfg -S /tmp/socket
root           8  0.2  0.8 260208 72404 ?        S    08:47   0:00 haproxy -W -db -f /etc/haproxy/haproxy.cfg -S /tmp/socket
root          24  0.0  0.0   4152  3472 pts/0    Ss   08:47   0:00 /bin/bash
root         519  0.0  0.0   3888  2876 ?        S    08:48   0:00 /bin/bash /etc/haproxy/healthcheck NOT_USED NOT_USED 18.138.80.239 443
root         520  0.0  0.0   3888  1500 ?        S    08:48   0:00 /bin/bash /etc/haproxy/healthcheck NOT_USED NOT_USED 18.138.80.239 443
root         521  0.0  0.1 237636 10320 ?        Sl   08:48   0:00 /usr/local/bin/te-ping 18.138.80.239 -p 443 -c 50
root         522  0.0  0.0   8216  2604 ?        S    08:48   0:00 /usr/bin/awk /packet loss/ { print strtonum($6) }

我的 haproxy.cfg 如下所示:

global
    log stdout format raw local0 debug
    stats socket /tmp/socket mode 660 level admin expose-fd listeners
    stats timeout 2m
    insecure-fork-wanted
    insecure-setuid-wanted
    external-check
    nbthread 1

defaults
    log  global
    mode    tcp
    option  tcplog
    maxconn  8000
    retries  5
    timeout  queue 1m
    timeout  connect 10s
    timeout  client 1m
    timeout  server 1m
    timeout  check 10m

frontend....

backend data_us
    option log-health-checks
    option external-check
    external-check command /etc/haproxy/healthcheck
    server data_us proxy1-ap-southeast-1.aws.ca.thousandeyes.com:443 check inter 10m rise 5 fall 5 resolvers mynameservers resolve-prefer ipv4

我以为增加超时会有所帮助,但到目前为止还没有。然后我认为这可能是一个进程问题,其中 haproxy 生成多个进程并终止它们以节省内存,所以我减少了 nbthread,但这没有用。我的脚本如下:

#!/bin/bash

set -x 

not_used_1=$1
not_used_2=$2
host=$3
port=$4

packet_loss=$(/usr/local/bin/te-ping $host -p $port -c 50 | /usr/bin/awk '/packet loss/ { print strtonum($6) }')
if [ "${packet_loss}" -lt 5 ]; then
  echo "${packet_loss}"
  exit 0;
else
  exit 1;
fi

为什么我的脚本在完成之前就被终止了?为什么 haproxy 会启动两个主进程?为什么即使我指定的超时时间为 10 分钟,它也会生成多个进程来进行外部检查?

答案1

我找到了问题所在。我在错误的后端服务器上设置了超时时间……Haproxy 默认超时时间为 2 秒,因为我在错误的后端设置了超时时间,所以它会终止进程并每 2 秒生成一个新进程。因此,脚本永远无法完成。

相关内容