测试20万qps的web接口(二)
本篇文章主要用于描述:在如何应对支撑大量短连接请求时,遇到的问题。
设想
设定: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之间插入一个负载均衡组件,就可以在压测端和目标端之间创建非常多的短连接?
本次引入了lvs来作为负载均衡组件,使用了DR和NAT模式,通过实验,发现这种方式不行(之前对lvs连接建立方式的理解有偏差)。
client只绑定1个ip,并且压测时只指定一个目标ip,这样是不能创建大量的短连接(比如每秒1万)。
因为client会与lvs的vip创建tcp连接,也就是只有1个四元组。
刚开始使用浪潮5212M5和PVE搭建测试环境,改了很多种参数(绑定多个ip、nginx的split_clients设置),没有成功。

这是使用PVE创建的虚拟机。

觉得可能是自己对lvs的理解有偏差,开始使用轻量级的vmware搭建DR模式的测试环境。
通过分析网络连接,发现client与vip之间建立的tcp连接是一个固定的四元组。

既然DR模式不行,就测试nat模式。
通过分析网络连接,发现client与vip之间建立的tcp连接是一个固定的四元组。

结论:client会与lvs的vip建立tcp连接,这个vip在哪个服务器上不重要,标识这个连接的就是一个固定的四元组。
之前错误以为client会与lvs的dip建立tcp连接,这样就可以扩展多个四元组。
后续规划
这次实验失败,受到了很大的挫折。
搭建lvs和pve环境遇到了各种问题(比如网关、转发、nat、pve的虚拟网桥)。
搭建大量短连接测试环境的意义时什么,真有那么大作用吗?
是否要研究或定制wrk?
有没有大佬可以指点一下。