haproxy问题
# TCP计数器ListenOverflows大量增加
查看方法:
cat /proc/net/netstat | awk '/TcpExt/ { print $21,$22 }'
1
原因:
系统调用listen函数(int listen(int sockfd, int backlog);)的队列长度由min(backlog ,内核参数 net.core.somaxconn ) 决定,对应socket的listen 队列已满的情况下,在新增一个连接时的情况,ListenOverflows计数器加 1 。
解决方案:
调整系统参数 net.core.somaxconn = 65535 #默认为128
cat 65535 > /proc/sys/net/core/somaxconn
1
# global常用的优化配置:
mode http //设置默认工作模式为http,也可以在backend段中单独设置
log global
option httplog //设置记录的日志格式更为详细,可以在frontend段中单独设置
option http-server-close //主动断开长连接,当开启长连接时,应该开启此项。haproxy在向后端服务器发送请求时,会在header中添加“Connection:close”,但是有些服务器看到此头部时,直接会拒绝访问
option http-pretend-keepalive //假装自己是保持连接的,当开启此选项时,haproxy会去掉头部“Connection:close”,此选项与http-server-close一起使用
option forwardfor except 127.0.0.0/8 //向后端转发客户端的真实IP,except表示排除指定的网段
retries 3
timeout http-request 10s //当客户端发送的请求,在指定时间内发送不完整时,断开连接
timeout queue 1m
timeout connect 10s //建立连接的超时时长
timeout client 1m //当客户超过多久不活动时的超时时长
timeout server 1m
timeout http-keep-alive 10s //长连接超时时长
timeout check 10s //健康检查超时时长
maxconn 655350 //最大连接数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# linux系统的优化:
# 1.长连接
如果不设置长连接,会造成大量的timewait
# 2.缩短time_wait时间
#cat /proc/sys/net/ipv4/tcp_fin_timeout //查看timewait的默认保持时长,默认为60s
永久生效在/etc/sysctl.conf中设置
设置方法:net.ipv4.tcp_fin_timeout = 10
# 3.设置time_wait快速回收和重用
#cat /proc/sys/net/ipv4/tcp_tw_reuse
#cat /proc/sys/net/ipv4/tcp_tw_recycle
默认为0,设置为1
设置方法:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
1
2
2
# 4.修改本地端口可用范围
#cat /proc/sys/net/ipv4/ip_local_port_range
默认为32768到61000
建议把32768的值设的小一点,以便可以使用更多的端口,如设为1024
设置方法:
net.ipv4.ip_local_port_range = 4000 65535
1
sysctl -p使设置生效
# 5.设置可打开文件描述符
用ulimit -n进行查看,默认为1024
echo '* - nofile 65535' >> /etc/security/limits.conf
1
上次更新: 2022/06/12, 15:48:09