测试20万qps的web接口(三)
本篇文章主要描述:在不改变当前运行环境的情况下,是否可以使用lvs来支撑大量的短连接建立。
环境设定:client只绑定一个ip,并且压测时只指定一个目标ip(这样就不需要针对不同的压测程序做特殊处理),web只绑定一个ip。
期望目标:如果想在client和web之间发起大量的短连接请求(每秒20W),是否可以在两者之间插入一个负载均衡组件来处理?
最终结论:做了很多尝试,发现即使使用lvs,也没法突破连接四元组限制。
正确方式一
很早之前,做过类似的实验。
在client上绑定了多个ip,通过jmeter发起压测请求时,设置不同源ip,这样可以支撑大量的短连接。
正确方式二
很早之前,做过类似的实验。
在client和web之间加入nginx,client访问nginx,nginx访问web。
错误方式一
使用前两种正确方式时,都需要在client做一些特殊处理(要么绑定多个源ip,要么指定多个目标ip,对压测程序的使用造成不便)。
有没有一种更加通用的方案,比如直接在client和web之间插入一个负载均衡组件,就可以在压测端和目标端之间创建非常多的短连接?
此时,client只绑定1个ip,并且压测时只指定一个目标ip。
本次引入了lvs来作为负载均衡组件,使用了DR和NAT模式。
通过实验,发现不能创建大量的短连接(比如每秒1万),因为client只会与lvs的vip建立tcp连接,也就是只有1个四元组。
使用PVE搭建环境
使用浪潮5212M5和PVE搭建测试环境,改了很多种参数(绑定多个ip、nginx的split_clients设置),也不能创建大量短连接。
这里选择DR模式,觉得它工作在二层,应该更容易支持多个四元组(实际上不是这样的)。
这是使用PVE创建的虚拟机。
使用vmware评估lvs
觉得可能是自己对lvs的理解有偏差,于是使用轻量级的vmware搭建DR模式的测试环境(先跑通流程,再去浪潮5212M5上测试,主要是5212M5功耗高、噪音大)。
通过分析网络连接,发现client与vip之间建立的tcp连接是一个固定ip的四元组。
既然DR模式不行,就测试nat模式。
通过分析网络连接,发现client与vip之间建立的tcp连接也是一个固定ip的四元组。
结论:client会与lvs的vip建立tcp连接,这个vip在哪个服务器上不重要,标识这个连接的就是一个固定的四元组。
之前错误以为client会与lvs的dip建立tcp连接,这样就可以扩展多个四元组。
后续规划
这次投入了很多时间和精力来做测试,没有达到预期。
在搭建lvs和pve环境时遇到了各种问题(比如网关、转发、nat、虚拟网桥),解决之后对网络的理解也更加深刻。
有时也在反省,测试大量短连接的意义有那么大吗。
既然lvs不能突破ip的四元组限制,是否要继续寻找其它方式。
有没有大佬可以指点一下。