公司stage云环境中的应用流量由一个SLB集群承载,路由规则数量近3500时,用户反馈会偶现connect timeout 和Connection reset by peer的情况。

| 组件 | 规格 |
|---|---|
| haproxy | 4c8g50g-ssd * 2 带宽1000Mb/s |
| apisix+etcd) | 4c8g50g-ssd * 3 |
先排除已经达到性能瓶颈,各个规格均没有打满 包括cpu,内存,带宽和磁盘都没有达到瓶颈
通过网络工具查看丢包情况、实时带宽
通过netstat 发现有syns drop 的情况,怀疑是并发过大造成内核丢弃syn连接包,修改半连接队列大小为65535后观察,暂时没有发现connect timeout 情况,但还是存在 Connection reset by peer。
通过修改内核参数net.ipv4.tcp_tw_reuse 原来是0
bashnet.ipv4.tcp_tw_reuse = 1 net.ipv4.vs.conn_reuse_mode = 1
注
net.ipv4.tcp_tw_reuse = 1 是一个客户端优化,用于在高并发发起短连接时,快速复用 TIME_WAIT 状态的 socket,避免源端口耗尽。
net.ipv4.vs.conn_reuse_mode = 1 是一个LVS/IPVS 负载均衡器优化,用于在客户端快速复用源端口时,强制 IPVS 重新调度新连接,而不是将其发送到可能已失效的旧后端。
依然没有好转
发现之前net.ipv4.tcp_max_syn_backlog=128
然后把haproxy和slb的ecs的内核参数都调整为
bashnet.ipv4.tcp_max_syn_backlog=81920 net.core.somaxconn=65535
持续观察暂未复现
以前stage环境并没有出现是因为没有大量连接并发应用,最近stage出现业务部门压测接口的情况,因此在并发连接增大后就出现了瞬时并发把半连接队列打满造成丢包,把全连接和半连接队列都调大后就未出现了。
connect timeout (连接超时) 主要是因为半连接队列 (SYN Queue) 满了,内核直接丢弃了 SYN 包。
Connection reset by peer (连接被重置) 主要是因为全连接队列 (Accept Queue) 满了,TCP 握手虽然完成了,但应用来不及 accept(),内核在收到客户端的后续数据时发送了 RST。
本文作者:lyuseek
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!