TOC

阿里云 SLB 连接超时问题

SLB: Server Load Balance, 是阿里云提供的负载均衡服务,可以工作在 4 层和 7 层网络。

最近接到同事反馈说是我们的服务连接偶尔有超时的情况。就是一个简单的定时任务,5 个并发,每次大概需要处理几万次请求。
PS:后来他们反馈说是一直有问题,只不过他们内部消化了,通过重试。要是我,肯定把这个问题抛出来了,这明显不对劲,内网的连接速度怎么会慢到这个地步。

一开始的怀疑重点是单台机器出现问题,但我自己逐台检查连接没有问题,在调用方机器上测试连接也没有问题。

然后才想起来,调用方走的是 LB 地址。把测试连接的脚本拿过来跑,发现果然偶尔有连接超时。

我想大部分连接(包含一些业务交互)的处理时间肯定应该在 200ms 以内,把超过 200ms 的请求处理时间记录下来,然后就发现有规律了。

有很多请求需要 1.00xx 秒, 部分超时请求就都是 3 秒。

服务器有参数优化,net.ipv4.tcp_syn_retries 配置的是 1,所以超时时间是 3 秒。这个可以理解。那前面的 1.00xx 秒就很可疑了, 这么整齐划一,让我怀疑丢 SYN 包的问题。

把 SYN 包重试次数调整到 3 之后,果然,部分请求需要 1.00xx 秒,部分请求需要 3.00xx 秒。如果不改参数,这部分的请求会报超时。

为了验证猜想,用 tcpdump 抓包,果然发现有部分 SYN 包丢失,重试 1 次或 2 两次成功。

然后就是和阿里云售后沟通了,只能等待他们慢慢回复工单(这种做事态度一点也不互联网)。

作为一个 LB,有这样严重的问题,简直可以说是不可用了,实在是不应该。我希望他们回复是由于安全问题的考虑,加了什么限制,而不是说真的有什么 BUG。

第一次反馈

经过多次补充数据,他们终于有了反馈:

请问您的网络访问架构是否为: ECS-A --> 四层SLB --> ECS-A、ECS-B 这种访问模式 ?
如果是的话,那么目前四层TCP监听,是不支持ECS既作为SLB后端,又作为访问客户端的。即 不支持 ECS-A --> 四层SLB --> ECS-A、ECS-B 这种访问模式,因为这是违背LVS原理的。您看下官方文档 https://help.aliyun.com/knowledge_detail/55206.html 第1条说明。

我回复:

我们的架构应该是 ECS-A -> SLB -> ECS-B,不会自己访问自己。
我看了你们的文档,不是这种情况,还请继续仔细排查。
现在的问题是 SYN 包会丢,可能有 1.5% 的连接丢了一次,0.1% 的可能性会丢失两次。
不是不能访问。我们也没有同时做 C 和 S 的情况。

PS: 关于 LVS 的问题,参考:关于 LVS 不支持后端节点做客户端的问题

第二次反馈

slb.s1.small 规格的 SLB 实例太低了。
该规格支持的最大TCP并发连接数是5000(包含活跃连接数、非活跃连接数),也就是所有监控端口共用5000个并发。后台查看您SLB的TCP 80 端口经常有瞬时突发,并且存在连接丢弃的情况,怀疑是TCP 80占用了大量的SLB连接数,导致SLB连接数不足,从而导致SLB出现丢弃连接数的情况。

这个确实是我没想到的。LB 是按连接数付费。最后升级 SLB 来解决这个问题。

https://help.aliyun.com/document_detail/27695.html

参考资料与拓展阅读