一直以来,对SLB的转发性能到底如何比较好奇。于是,最近开了一个测试用的SLB来玩玩C1M,即我们能不能通过一个SLB来保持1百万个TCP长连接?
我的测试配置如下:
- 1个内网SLB,端口配置8000->8001, TCP按最小连接数转发。
- 3个后端server ECS,配置4核4G ram。
- 17个client ECS,配置1核2G ram。
- server是一个简单的echo service, client每秒向SLB发起500个TCP连接请求,建连后每隔20秒向server发送一个"hello"字符串,server收到后将"hello"发回。连接一旦建立,双方都不close, 会被一直保持住。
- server和client均使用Erlang实现。
配置完成让我们来说说测试步骤和测试结果:
首先在3个ECS上启动listen在8001端口的server。
然后在17个client ECS上分别启动client,每个client通过SLB的8000端口和后端server建立60000个TCP连接 (尽量用完64k个端口)。
测试结果见图,稳定保持百万级TCP连接, 下图只显示了960k (由于SLB的监控数据更新得太慢,我们没有等到它刷新完毕)。最终的峰值是17*60=1020k。
3台后端服务器上分别保持了360k, 300k和360k连接。之所以不平均是因为我们一开始想试试只用两台4核4G的ECS能不能hold住C1M,走到720k的时候发现内存不够用了,于是新加入了第三台。由于使用的最小连接数转发,新增的300k连接都全部被分到了这个新加入的节点上。从下图可以看到4核CPU处理C360k无压力,但4G内存已接近oom。
17台测试客户端各自的统计数据 (其中8台,其余的类似)。
综上可以得出结论:我们可以通过一个SLB来保持1百万(甚至更多的)TCP长连接。
如果您想仔细研究负载均衡这方面问题,请访问:https://bbs.aliyun.com/read/228428.html