一、調整內核參數
CONFIG_IP_VS_TAB_BITS
1.1 CONFIG_IP_VS_TAB_BITS說明
IPVS connection hash table size,取值范圍:[12,20]。該表用於記錄每個進來的連接及路由去向的信息。連接的Hash表要容納幾百萬個並發連接,任何一個報文到達都需要查找連接Hash表。Hash表的查找復雜度為O(n/m),其中n為Hash表中對象的個數,m為Hash表的桶個數。當對象在Hash表中均勻分布和Hash表的桶個數與對象個數一樣多時,Hash表的查找復雜度可以接近O(1)。
連接跟蹤表中,每行稱為一個hash bucket(hash桶),桶的個數是一個固定的值CONFIG_IP_VS_TAB_BITS,默認為12(2的12次方,4096)。這個值可以調整,該值的大小應該在 8 到 20 之間,詳細的調整方法見后面。每一行都是一個鏈表結構,包含N列(即N條連接記錄),這個N是無限的,N的數量決定了決定了查找的速度。在LVS的實現說明中,有這樣的一段話,可以幫助很好的理解行和列的關系:
為了評價Hash函數的效率,我們從一個運行IPVS的真實站點上取當前連接的樣本,它一共含有35652個並發連接。在有64K桶的Hash表中,連接分布如下:
桶的長度(Lj)該長度桶的個數(Nj)
5 16
4 126
3 980
2 5614
1 20900
所有連接查找一次的代價為45122,每個連接查找的平均代價為1.266(即45122/35652)。
LVS的調優建議將hash table的值設置為不低於並發連接數。例如,並發連接數為200,Persistent時間為200S,那么hash桶的個數應設置為盡可能接近200x200=40000,2的15次方為32768就可以了。當ip_vs_conn_tab_bits=20 時,哈希表的的大小(條目)為 pow(2,20),即 1048576,對於64位系統,IPVS占用大概16M內存,可以通過demsg看到:IPVS: Connection hash table configured (size=1048576, memory=16384Kbytes)。對於現在的服務器來說,這樣的內存占用不是問題。所以直接設置為20即可。
關於最大“連接數限制”:這里的hash桶的個數,並不是LVS最大連接數限制。LVS使用哈希鏈表解決“哈希沖突”,當連接數大於這個值時,必然會出現哈稀沖突,會(稍微)降低性能,但是並不對在功能上對LVS造成影響。
1.2 調整 ip_vs_conn_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
重新查看
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 ,然后,重啟。
或者重新編譯內核。
二、系統參數優化
2.1 關閉網卡LRO和GRO
現在大多數網卡都具有LRO/GRO功能,即 網卡收包時將同一流的小包合並成大包 (tcpdump抓包可以看到>MTU 1500bytes的數據包)交給 內核協議棧;LVS內核模塊在處理>MTU的數據包時,會丟棄;
因此,如果我們用LVS來傳輸大文件,很容易出現丟包,傳輸速度慢;
解決方法,關閉LRO/GRO功能,命令:
ethtool -k eth0 查看LRO/GRO當前是否打開
ethtool -K eth0 lro off 關閉GRO
ethtool -K eth0 gro off 關閉GRO
2.2 禁用ARP,增大backlog並發數
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.core.netdev_max_backlog = 500000
三、lvs自身配置調優
3.1 盡量避免sh算法
一些業務為了支持會話保持,選擇SH調度算法,以實現 同一源ip的請求調度到同一台RS上;但 SH算法本省沒有實現一致性hash,一旦一台RS down,當前所有連接都會斷掉;如果配置了inhibit_on_failure,那就更悲劇了,調度到該RS上的流量會一直損失;
實際線上使用時,如需 會話保持,建議配置 persistence_timeout參數,保證一段時間同一源ip的請求到同一RS上。
3.2 增大hash桶鎖個數
對於一個16核的服務器來說,可以將桶鎖個數調整為8.
ipvs源碼目錄下,修改文件vim ip_vs_conn.c - #define CT_LOCKARRAY_BITS 8;
參考:
http://blog.csdn.net/yanziguishi/article/details/7284793
http://blog.sina.com.cn/s/blog_781b0c850101ogne.html