我有一个运行 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 秒生成一个新进程。因此,脚本永远无法完成。