CPU、内存、网卡。
2. 系统方面
Linux系统默认有许多限制,对于在业务流量较大的情况下发挥负载均衡器的性能有很大影响。常见的如: 服务端可接受的最大连接数、可接受的最大半连接数、本地可用端口范围、time-wait连接数、可打开的最大文件句柄数、网卡等待队列大小等。
4. 网络方面
负载均衡器和真实服务器都是通过网络进行通信,如果条件允许,最好将它们置于同机房、同网段下,减小网络时延带来的影响。
二、性能调优介绍
多队列网卡在系统中有多个中断号,通过CPU核绑定,将各个中断号对应的网卡队列绑定到指定的CPU核处理,这样可以发挥多核CPU的优势,将中断请求分摊到多个cpu核上,提升cpu处理性能。
配置方法:
a. 检查系统是否已开启irqbanlance服务,如果有,则关闭该服务,手动进行cpu核绑定。
# ps -ef | grep irqbalance
b. 检查网卡是否支持多队列
#lspci -vvv | grep -A 30 "Ethernet controller"
检查是否存在 MSI-X: Enable+ Count >0,如果存在,说明网卡支持多队列。
# cat /proc/interrupts | grep em3
# echo 1 > /proc/irq/187/smp_affinity
# echo 4 > /proc/irq/189/smp_affinity
# echo 10 > /proc/irq/191/smp_affinity
# echo 40 > /proc/irq/193/smp_affinity
PS: 这里传入的值为16进制。转换为2进制后对应绑定的cpu核。
16进制80转换为2进制为1000 0000,表示将中断号194绑定到cpu7核上面。
1.2 关注系统链接跟踪表大小
系统链接跟踪表记录了经过系统转发的连接信息,通过加载nf_conntrack模块启用, 对于iptables、SNAT/DNAT等功能是必须启用链接跟踪表的。
但是如果链接跟踪表的值设置的太小,容易造成链接跟踪表满导致丢包的问题。所以需要关注系统的链接跟踪表最大值和当前值的大小,当二者相等时,说明表满,系统会drop新的连接请求。
# sysctl -a | grep nf_conntrack_max (查询系统链接跟踪表最大值)
# sysctl -a | grep nf_conntrack_count (查询系统链接跟踪表当前值)
如下图中的链接跟踪表最大值为65536就太小了,很容易造成丢包。
现在大多数网卡都具有LRO/GRO功能,即 网卡收包时将同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的数据包)交给 内核协议栈;LVS内核模块在处理>MTU的数据包时,会丢弃;
解决方法,关闭LRO/GRO功能,命令:(注意查看命令是小k,修改命令是大K)
ethtool -K eth0 lro off 关闭GRO
1.4 增大网卡的ring buffer值。
# ethtool -G em4 rx 4096
# sysctl -w net.core.netdev_max_backlog=262144
1.6 增大服务端全连接队列大小
# sysctl -w net.core.somaxconn=262144
# sysctl -w net.ipv4.tcp_max_syn_backlog=262144
1.8 增大系统可用的本地端口范围
tcp_max_tw_buckets表示系统允许存在的time_wait状态连接数。Time wait状态是tcp断连中一个正常的状态,它存在的作用主要包括:确保tcp连接可靠的断开和旧连接的报文在网络中彻底消失。如果这个值过小,则客户端不会进入time_wait状态,而是直接从FIN_WAIT状态结束。这时候服务端最后一次挥手的FIN消息会以收到RST结束,可能会导致服务端断连异常。
1.10 启用time_wait状态连接复用
增大tcp_max_tw_buckets值有一个负面影响,就是系统time_wait状态连接过多,将可用端口耗尽,导致没有足够的可用端口新建连接。这时候可以启用time_wait状态连接复用。注意需要同时启用时间戳tcp_timestamps。(注意开启tcp_timestamps后要确认关闭tcp_tw_recycle)
# sysctl -w net.ipv4.tcp_tw_reuse=1
# sysctl -a | grep fs.file-max
1.12 增大系统进程最大文件句柄数
# ulimit -n
注意这只是在当前shell下生效的,系统重启后会丢失,需要同时修改/etc/security/limits.conf中的nofile值。其中,* 这行的配置表示对非root用户生效。
* hard nofile 1024000
root hard nofile 1024000
可以用ipvsadm -l命令查询当前hash table的大小。
在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为:
重新加载ipvs模块。
worker_processes auto;
这里比较方便的是配置为auto,但是根据实际的系统情况指定worker进程数和手动绑定cpu核可能性能会更高一些,比如避开中断irq处理的cpu核,将worker进程绑定到其它空闲的cpu核上。
3.2 使用epoll模型
tcp_nodelay on;
3.4 增大单个worker进程的文件句柄数限制
worker_rlimit_nofile 1024000;
这里的最大并发连接包括前后端的连接,且该参数值不能大于worker_rlimit_nofile。
4. 硬件与网络配置调优
4.1 对物理网卡做多网卡绑定
负载均衡器和真实服务器靠网络传输数据,如果条件允许,将它们放在一个局域网内,避免数据传输走路由器传输。
1. 分析cpu性能
sar -u 1:每隔1秒打印出当前cpu的整体使用情况。
ps:sar和mastat需要安装sysstat工具包。
3. 查看网卡配置
# ethtool xxx
# cat /proc/net/bonding/xxx
#git clone https://github.com/wg/wrk
# ln -s xxx/wrk /usr/sbin/wrk
2. 使用方法
Options:
-d, --duration 压测时间
-s, --script 指定Lua脚本路径
--latency 在压测结束后,打印延迟统计信息
-v, --version 打印正在使用的wrk的详细版本信息
代表时间参数,支持时间单位 (2s, 2m, 2h)
使用10个线程、1000个长连接对指定URL压测60s,并打印时延信息。
Requests/sec: 149863.60 # 每秒的请求数,即QPS
指定头域实现http短连接测试。