lvs調優主要是針對內核參數的調優


一、調整內核參數

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM