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
参考资料与拓展阅读
- 阿里云, 负载均衡 SLB
- 阿里云,开发者社区, SLB 技术原理浅析
- 阿里云,开发者社区, 负载均衡(SLB)使用最佳实践
- 阿里云,帮助中心, ALB 快速入门
- 阿里云,帮助中心, 客户端无法访问负载均衡 SLB