LVS性能优化及问题总结
一、LVS 性能调优的方法最佳实践
1、最小化安装编译系统内核
2、优化持久服务超时时间:
1)显示超时时间
#ipvsadm -Ln –timeout
#Timeout (tcp tcpfin udp): 900 120 300
2)配置为与自身应用贴近的超时时间
#ipvsadm –set tcp tcpfin udp
ipvsadm –set 900 60 300
3、增大ipvs模块hash table的大小
ipvs模块hash table默认值为2^12=4096,改为2^20=1048576。可以用ipvsadm -l命令查询当前hash table的大小。
IP Virtual Server version 1.2.1 (size=4096)
修改方法:
在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为:
options ip_vs conn_tab_bits=20
重新加载ipvs模块。
IP Virtual Server version 1.2.1 (size=1048576)
4、文件句柄及进程数
1 | vim /etc/security/limits.conf |
5、修改内核参数vi /etc/sysctl.conf
net.core.rmem_max=16777216
net.core.wmem_max=16777216
#内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1
#内核放弃建立连接之前发送SYNACK 包的数量
net.ipv4.tcp_synack_retries = 1
#当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 300
#TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。
net.ipv4.tcp_keepalive_probes = 3
探测消息未获得响应时,重发该消息的间隔时间(秒)。
net.ipv4.tcp_keepalive_intvl =15
#在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。
net.ipv4.tcp_retries2 = 5
#开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_fin_timeout = 10
#表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
#timewait的数量,默认180000
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_wmem = 8192 131072 16777216
net.ipv4.tcp_rmem = 32768 131072 16777216
#启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1
#限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans = 327680
#开启SYN洪水攻击保护
net.ipv4.tcp_syncookies = 1
#未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 16384
#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000
#############
net.ipv4.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max=65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.core.somaxconn = 65535
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
#禁用ARP,增大backlog并发数
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.core.netdev_max_backlog = 500000
fs.file-max = 1048576
net.ipv4.ip_forward = 1
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.optmem_max = 81920
net.ipv4.route.gc_timeout = 20
net.ipv4.tcp_abort_on_overflow = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
#modprobe ip_conntrack
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_max = 1048576
net.nf_conntrack_max = 1048576
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
注意:
net.ipv4.tcp_tw_recycle = 1有坑,在nat环境下慎用。
越是大并发,越要注意net.ipv4.tcp_max_tw_buckets的值不能太大
6、关闭网卡LRO和GRO
1 | ethtool -K eth0 gro off |
7、调整内核的时钟机制
1 | kernel nohz=off |
二、遇到的问题
1、机房无法实时刷新MAC,LVS+Heartbeat方案无法正常随机切换IP?
假如两台VS之间使用的互备关系,那么当一台VS接管LVS服务时,可能会网络不通,这时因为路由器的MAC缓存表里无法及时刷新MAC.关于vip这个
地址的MAC地址还是替换的VS的MAC,有两种解决方法,一种是修改新VS的MAC地址,另一种是使用send_arp /arpiing命令.
以arping命令为例.
/sbin/arping -I eth0 -c 3 -s ${vip} ${gateway_ip} > /dev/null 2>&1
这个命令不一定非要在VS上执行,只要在同一VLAN即可:/sbin/arping -f -q -c 5 -w 5 -I eth0 -s $WEB_VIP -U $GW
2、某台机器down掉以后,IPVS列表中权值已经置0了,为什么还轮询到这台机器上?
##配置 ldirectord.conf
设置为:quiescent=no或 echo 1 >/proc/sys/net/ipv4/vs/expire_nodest_conn
3、为什么做压力测试的时候,LVS不能负载均衡多部分连接只到某一台机器上?
这和LVS脚本里指定-p参数有关,如果指定了一个client在一定的时间内,将会被调度到同一台RS上。所以你在从来源来做压力测试的时候大部分连接会调度到同一台机器上,这样就出现了负载不均衡的状况。
4、用四个参数来关闭arp查询响应请求:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
5、InActConn并不代表错误连接,它是指不活跃连接(Inactive Connections),
我们将处于TCP ESTABLISH状态以外的连接都称为不活跃连接,例如处于SYN_RECV状态的连接,处于TIME_WAIT状态的连接等。
6、在LVS方案中,虚拟ip地址与普通网络接口不同,这点需要特别注意。
虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。 为什么要这样呢?因为有若干机器要使用同一个ip地址,用本身做广播地址和把子网掩码设成4个255就不会造成ip地址冲突了,否则lvs将不能正常转发访问请求。
三、其他需要注意的细节
- LVS调度的最小单位是“连接”。
- 当apache的KeepAlive被设置成Off时,“连接”才能被较均衡的调度。
- 在不指定-p参数时,LVS才真正以“连接”为单位按“权值”调度流量。
- 在指定了-p参数时,则一个client在一定时间内,将会被调度到同一台RS。
- 可以通过”ipvsadm –set tcp tcpfin udp”来调整TCP和UDP的超时,让连接淘汰得快一些。
- 在NAT模式时,RS的PORT参数才有意义。
- DR和TUN模式时,InActConn 是没有意义的