大流量、高负载LVS系统优化方法详解及注意事项

Network

增加LVS主机的网络吞吐能力,有利于提高LVS的处理速度和能力。

1. 使用更快的网卡,比如使用千兆、万兆的网卡。

2. 可以进一步将两块或多块网卡绑定(多块网卡的绑定有待验证),bonding 时 mode=0 (balance-rr)或者 mode=4(802.3ad,需要交换机支持聚合端口),miimon=80或者 miimon=100(毫秒)。

TCP/IP

/etc/sysctl.conf

net.core.netdev_max_backlog = 60000

Hardware

IPVS的运行,使用的服务器资源主要是 CPU、内存I/O、网络I/O;IPVS完全运行在内存中,并且运行在内核态。

当IPVS的应用在DR模式时,即不耗CPU,也不耗I/O,运行非常快,所以系统负载非常的低,跟据我的经验,一般负载总是0。所以 LVS 应用对服务器的配置要求非常低。以为 LVS 很重要,所以配置一个相当高端的服务器,实在是一种浪费。

其实我们可以做一下计算:

以64位系统为例,一个哈希表条目,16个字节,一个 ip_vs_conn 结构 192字节。以哈希表的冲突尽可能的少为场景(将 ip_vs_conn_tab_bits 设置为最大值 20 ),那么:

pow(2,20)=1048576

pow(2,20)*(16+192)/1024/1024 = 208 M

就是说,当系统当前有100 万连接的时候,才用去内存 208 M,所以 IPVS 的主机,即使是1G的内存,也足以承载负载。

调整内核参数

CONFIG_IP_VS_TAB_BITS
新的IPVS代码,允许调整 ip_vs_conn_bits 的值。而老的IPVS代码则需要通过重新编译来调整。

在发行版里,IPVS通常是以模块的形式编译的。

确认能否调整使用命令 modinfo -p ip_vs(查看 ip_vs 模块的参数),看有没有 conn_tab_bits 参数可用。假如可以用,那么说时可以调整,调整方法是加载时通过设置 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),则前面加的参数没有生效

modprobe -r ip_vs

modprobe ip_vs

或者重启ipvsadm使修改生效
service ipvsadm restart

重新查看

IP Virtual Server version 1.2.1 (size=1048576)

假如没有 conn_tab_bits 参数可用,则需要重新调整编译选项,重新编译。

Centos6.2,内核版本2.6.32-220.13.1.el6.x86_64,仍然不支持这个参数,只能自定义编译了。

另外,假如IPVS支持调整 ip_vs_conn_tab_bits,而又将IPVS集成进了内核,那么只能通过重启,向内核传递参数来调整了。在引导程序的 kernel 相关的配置行上,添加:ip_vs.conn_tab_bits=20 ,然后,重启。

或者重新编译内核。

lvs自身配置调优

尽量避免sh算法

一些业务为了支持会话保持,选择SH调度算法,以实现 同一源ip的请求调度到同一台RS上;但 SH算法本省没有实现一致性hash,一旦一台RS down,当前所有连接都会断掉;如果配置了inhibit_on_failure,那就更悲剧了,调度到该RS上的流量会一直损失;

实际线上使用时,如需 会话保持,建议配置 persistence_timeout参数,保证一段时间同一源ip的请求到同一RS上。

参考资料
大流量、高负载LVS系统优化注意事项:http://os.51cto.com/art/201012/239215.htm
我才知道的淘宝内核对LVS的性能优化:http://www.lvtao.net/server/taobao-linux-kernel.html
LVS性能调优小记:http://shanks.blog.51cto.com/3899909/1319980/

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据