网络拓扑图是这样的:
整个过程都需要保持长连接,nginx接收到新的连接后转发给后端的服务器。
确定一个连接要有4个东西:
- 源IP
- 源端口
- 目的IP
- 目的端口
现在在这个场景下,nginx到后端服务器,这里源IP和目的IP、目的端口都是固定的,只有源端口是可以变的,所以最大的连接数就是源端口的数量,即65535,按65000来计算,那么在两台后端服务的情况下,最多也只有130000条连接。远远不能满足50W用户连接。
===
所以我这边分别给两台后端服务器的网络接口增加了5个IP。
现在的最大连接数就变成了 65000 * 10 = 650000
===
增加了IP数量后,实际测试时,确实也突破了13W连接数,达到了20多万连接数。但是到了20W-30W之后(具体数量不确定),nginx就出现了卡住的情况:
htop里面最后一个画面是 CPU 100%
卡住之后没有办法创建新的连接,旧的连接仍然可用。
尝试增加了nginx这台服务器的内存大小,问题依旧存在。
问题:
一般情况下,当同时连接数达到50W这个量级的时候,nginx服务器需要什么配置
有其他排查这个问题的方法可以推荐吗?
通过什么方法可以让nginx在访问不同后端的时候,使用不同的源IP访问后端,如果这样操作的话,nginx每增加一个IP,理论连接数都能*2。
最后还是把nginx换成了haproxy。因为haproxy可以在配置upstream的时候指定源IP。
使用haproxy后,测试可以支持到100W以上长连接。