应对高并发,LVS的参数调优

一、调整ipvs connection hash表的大小

1、说明:

IPVS connection hash table size,取值范围:[12,20]。该表用于记录每个进来的连接及路由去向的信息。连接的Hash表要容纳几百万个并发连接,任何一个报文到达都需要查找连接Hash表,Hash表是系统使用最频繁的部分。

LVS的调优建议将hash table的值设置为不低于并发连接数。例如,并发连接数为200,Persistent时间为200S,那么hash桶的个数应设置为尽可能接近200x200=40000,2的15次方为32768就可以了。当ip_vs_conn_tab_bits=20 时,哈希表的的大小(条目)为 pow(2,20),即 1048576,对于64位系统,IPVS占用大概16M内存,可以通过demsg看到:IPVS: Connection hash table configured (size=1048576, memory=16384Kbytes)。对于现在的服务器来说,这样的内存占用不是问题。所以直接设置为20即可。

调优的原因:高并发下,hash table记录的路由信息会很大,如果size过小,将table占满,LVS无法调度新请求。

2、调整 ip_vs_conn_tab_bits的方法:

在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为:

options ip_vs conn_tab_bits=20

查看:

#ipvsadm -l

如果显示IP Virtual Server version 1.2.1 (size=4096),则前面加的参数没有生效,需要重启服务器生效。

重启服务器之后,IP Virtual Server version 1.2.1 (size=1048576)

 

二、--set tcp tcpfin udp 设置连接超时值

1、说明:

ipvsadm --set 设置的值,表示的是同一个TCP/UDP连接的超时时间,即同一个客户端的同一个port发起的请求,需要与persistence_timeout参数进行区分:

(1)persistence_timeout参数:

 在参数的时间范围内同一用户(client IP)的多次访问会被ipvs分配到同一台realserver上。

(2)--set tcp tcpfin udp

针对链接的超时时间。以tcp为例,一个tcp连接建立后会传输N个报文, 当两个报文相继到达的时间差在超时时间内就会被转发到同一台realserver上进行处理, 若时间差大于超时时间就会根据调度算法重新选择realserver,连接就有可能出现异常。 ipvs是根据client IP  和 client port来识别是不是同一个链接发的报文。

ESTABLISHED前面的超时时间就是tcp|tcpfin|udp中的tcp的值。该值表示一条TCP连接记录的空闲释放时间。如果客户端和服务端建立了连接,则IPVS中会出现一条ESTABLISHED的记录。每当客户端和服务端的连接中有[信息交互]时,该超时时间都会刷新为初始值。如果连接处于空闲状态,即一直没有信息交互,则等到该值超时后,ESTABLISHED的记录会直接消失(这种情况下IPVS记录不会进入FIN_WAIT),实际上TCP连接还是存在的,并没有中断,但是由于持久化时间到了,后续同一客户端(IP+Port)过来的请求会重新调度。所以长连接业务场景需要注意根据业务需要设置好这个TCP空闲连接的超时时间。

FIN_WAIT前面的超时时间就是tcp|tcpfin|udp中的tcpfin的值。在IPVS记录的每一条连接中,如果客户端发起了FIN断连,则IPVS中记录的连接状态会从ESTABLISHED变为FIN_WAIT。该值超时后,FIN_WAIT状态的记录直接消失。

还有一个细节要注意,如果用户没有配置持久化时间persistence_timeout,那么在ipvsadm -lnc查询的记录里面是不会生成NONE记录模板的,因为此时不需要持久化。但是!!!ipvsadm -lnc记录中还是会生成ESTABLISHED记录的,后续同一客户端(IP+PORT)的请求都会调度给同一个[服务器],直到该连接达到了TCP空闲连接超时时间后,ESTABLISHED记录消失,ipvs才会重新调度该客户端的请求。这个机制是必须的,不能算作持久化(持久化针对的是同一客户端IP,可以是不同端口)。因为TCP在传输的过程中可能出出现报文分片,如果ipvs把来自同一客户端(IP+PORT)的不同分片调度给了不同的服务器,那么服务器收到报文分片后无法重新组合报文。

调优的原因:(1)为了准确记录ActiveConn的数量(即ESTABLISHED的数量);(2)为了减少hash table的占用。

2、设置方法:

默认值:

[root@~]# ipvsadm -Ln --timeout
Timeout (tcp tcpfin udp): 900 120 300

可设置:#ipvsadm --set 5 5 5

将其命令写入开启启动文件,#echo "ipvsadm --set 5 5 5" >>/etc/rc.local。避免服务器重启之后,参数失效。

设置值的大小,需要结合具体的业务场景,如果是客户端请求图片,正常每个图片都在5s内可以完成交互,那可以将第一个参数设置为5s,如果是传输大文件,需要在5分钟才能完成交互,则第一个参数也应该相应的调大。

posted @ 2023-01-13 15:00  小Q童鞋  阅读(887)  评论(1编辑  收藏  举报