Tag: lvs

LVS hash size

LVS 有个 connection hash table ,默认的 size 为 4096,可以通过以下命令得到:

# ipvsadm -ln
IP Virtual Server version 1.0.12 (size=4096)

简单地说,这个hash table 用于记录每个进来的连接及路由去向的信息。面对庞大的连接时,这个4096是远远不够的,这时就会产生冲突,然后hash table  就不断置换table 中的数据,系统的负荷就这样上来了。所以,很多调优文章都说,要把这个值调大。至于如何调大呢,好像必须重编译内核了。。。

我的是 centos 5.4 final ,利用 srpm 去重编译吧,使用当前系统的 config ,这样编译后的内核只不过是改变了 hash table 的值,并没有改变其它的东西。

下一个 kernel 的 srpm :http://mirrors.163.com/centos/5.4/os/SRPMS/kernel-2.6.18-164.el5.src.rpm

重编内核时,把原来的 config(/boot/config-2.6.18-164.el5) copy 覆盖 SOURCES/kernel-2.6.18-x86_64.config .

把第一行的

#

改为

# x86_64

同时,修改 CONFIG_IP_VS_TAB_BITS=12 (2的12次方,4096)为 CONFIG_IP_VS_TAB_BITS=20 。

然后 rpmbuild -ba –target=`uname -m` kernel-2.6.spec ,新编译出来的kernel-2.6.18-164.el5.x86_64.rpm 就在 RPMS/x86_64/ 里了。

rpm -Uvh 吧。

reboot 后,再 ipvsadm -ln 就可以看到

IP Virtual Server version 1.2.1 (size=1048576)

成功!
lvs 调优的文章通常会说,如果你的并发连接数是 200,keep alive 是200秒,那么hash table size 就应该设置为不要低于 200×200=40000 太多,2的15次方32768 就差不多了。不过,谁知道我们的需求是否会变呢?我一般都懒得算,直接开到最大,20 就是最大的了。

还需要注意一点,就是每个连接是要占用内存的,印象中是每个连接占用136 bytes ,尽管说 lvs 可以抗百万级别的连接,也要注意有没有足够的内存哦,呵呵。

利用 piranha 快速搭建 lvs

最近为那个公司很重视的项目搭建 lvs ,在这里 log 一下吧。

利用red hat 提供的 piranha ,简单快捷。

我选择的是 centos 5.4 ,安装 piranha ,很简单

yum install piranha

此时,它还需要你安装 ipvsadm , php , php-cli , php-common , httpd ,piranha 是一个 web 管理的工具,没办法,虽然我不用web 界面,但这些在yum 下还是必须装上的。

装完以后,/etc/sysconfig/ha/lvs.cf 还是空的,我去抄一份过来。

serial_no = 1
primary = 60.12.227.1
service = lvs
backup_active = 1
backup = 60.12.227.2
heartbeat = 1
heartbeat_port = 10001
keepalive = 6
deadtime = 18
network = direct
debug_level = NONE
virtual vs[1] {
    active = 1
    address = 60.12.227.200 eth0:200
    vip_nmask = 255.255.255.0
    port = 80
    send = "GET / HTTP/1.0\r\n\r\n"
    expect = "HTTP"
    use_regex = 0
    load_monitor = none
    scheduler = wlc
    protocol = tcp
    timeout = 6
    reentry = 15
    quiesce_server = 0
    server rs[1] {
    address = 192.168.0.1
        active = 1
        weight = 2
    }
    server rs[2] {
    address = 192.168.0.2
        active = 1
        weight = 2
    }
}

到此,lvs 的 director 端,算是安装完成了。

有人会问了,为什么我没有修改 /proc/sys/net/ipv4/ip_forward 为1 。其实,这里我也还不是很懂,理论上,转发是必须设为1 的,但我发现,貌似不设,也可以正常工作,难道是 piranha 的关系??

然后就是配置 real server 端了。

我又抄一个shell 过来

#!/bin/sh
 
VIP=60.12.227.200
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
 
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

由于我的director 端配置的是 dr 模式,所以必须关闭arp 响应。

执行一下这个shell,real server 端也算是完成了。

启动 director 端:

# /etc/init.d/pulse start
Starting pulse:                                            [  OK  ]

查看服务状态:

# ipvsadm -ln
 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  60.12.227.200:80 wlc
-> 192.168.0.1:80             Route   2      326        172
-> 192.168.0.2:80             Route   2      326        192

搭建完成了,算是比较快速的了,呵呵。还有一点知识点的,下回再说吧。