LVS hash size解决4096个并发的问题
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 可以抗百万级别的连接,也要注意有没有足够的内存哦,呵呵。
来源:http://blog.helosa.org/2010/03/31/lvs-hash-size.html
建议继续学习:
- HashMap解决hash冲突的方法 (阅读:11038)
- 关于memcache分布式一致性hash (阅读:10636)
- MinHash原理与应用 (阅读:5699)
- 无锁HashMap的原理与实现 (阅读:5098)
- 如果用户在5分钟内重复上线,就给他发警告,问如何设计? (阅读:4815)
- Ubuntu 下Hash校验和不符问题的解决 (阅读:4290)
- LVS & MySQL NDB Cluster (阅读:4023)
- 记一次LVS/Nginx环境下的访问控制 (阅读:3678)
- LVS & MySQL NDB Cluster (阅读:3665)
- 分布式系统hash策略 (阅读:3678)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:sbear 来源: 阿熊的窝
- 标签: 4096 hash LVS
- 发布时间:2012-10-26 00:13:54
- [699] WEB系统需要关注的一些点
- [372] 如何拿下简短的域名
- [19] 移动音乐产品梳理
- [17] 产品经理的取舍之道与抽象能力
- [16] 豆瓣是啥?
- [16] iOS和Android设计规范备忘表
- [15] 新手产品经理都混哪里
- [15] 为什么工程师会造出蹩脚的产品
- [14] Perl 的线程中的共享
- [13] 基于SSD的数据库性能优化