LVS性能調優小記

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章