Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

Linux bonding
post by tommy @ 03 二月, 2012 09:08

過年前弄了三張 intel E1G42ET 回來, 趁著過年假期在家就試看看 teaming 的效果. 記得以前在 kernel 2.2/2.4 的年代, intel 的網卡是用自己的 iANS 軟體來在處理 teaming, 不過... 看起來該軟體很久沒更新了, 且在目前 intel 的 e1000/e1000e/igb 等 driver 中, 也說明 teaming 的功能在 driver 已經不存在, 要使用 linux 的 kernel 的 bonding 模組來處理.

在 debian 裡頭, 原則上只要裝上ifenslave-2.6 之後,把設定寫在 /etc/network/interfaces 裡頭就可以了.

由於用的 3com 2916 switch 有支援 802.3ad 的功能, 所以先試的是這一個模式:

auto bond0
iface bond0 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254
mtu 9216
slaves ethi0 ethi1
bond-miimon 100
bond-downdelay 200
bond-updelay 200
bond-mode 802.3ad
bond_xmit_hash_policy layer3+4

使用這個模式, 必須 swtich 也要有 802.3ad 的支援 (也就是 LACP), 並且把用到的那些 port 用 LACP 的方式綁在一起.

跑起來的效果.... 出去的封包會依據 xmit_hash_policy 的設定來決定, 使用一台 server, 兩台 client 的方式來測, 用 rsync 或 ftp 來抓檔案時, 通常是會分別由兩個 port 把資料送出去 (不過有碰過還是用同一個 port 的經驗).... 然後進來的封包, 照說應該由 switch 來動態決定由那一個 port 進來.... 不過... 不管我怎麼試, 似乎都是走同一個 port.... 所以... 當某個 client 把 1G 吃快滿的時候, 別的 client 連線就變很慢了... 一點都沒有 teaming 的效果. 由 mrtg 或 sar -n DEV 5 的結果來看, 出去的流量是 1G+1G=2G (有時似乎仍是 1G, 不過多數碰到的情形都可以達到 2G 的效果), 不過進來的流量還是 1G (這似乎與文件上的說明不同, 不過我看不出那兒的設定有錯).

後來又試了 balance-rr 的模式:

auto bond0
iface bond0 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254
mtu 9216
slaves ethi0 ethi1
bond-miimon 100
bond-downdelay 200
bond-updelay 200
bond-mode balance-rr

這一個方式, 在 google 找到的文件, 有的說不用 switch 的支援, 不過也有說要 switch 有支援才能用.

我自己試的結果, switch 沒任何設定的情形下, 在某些情形下是可以運作的, 不過... 有些情形又不行 (弄不清楚原因). 如果要完全沒問題, 要在 switch 上頭對那些 port 一樣要做 Link Aggregation, 只不要不是選擇 LACP, 而是用 static 的方式 (不同的廠牌 switch, 名稱可能會不一樣).

這一個方式, 可以保證出去的封包會平均由每一個 device 出來 (不像 802.3ad 那一個模式, 有時還是都走同一個), 所以出去一定是 1G+1G=2G, 不過... 進來就只會固定走一個.

運作的效果, 我認為比用 802.3ad 模式會好一些... 不過進出都能到 1G+1G=2G 應該會是最好情形.

所以.... 最後試的是 balance-alb 的方式:

auto bond0
iface bond0 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254
mtu 9216
slaves ethi0 ethi1
bond-miimon 100
bond-downdelay 200
bond-updelay 200
bond-mode balance-alb

一開始測試時, 果然可以正常達到進出都是 1G+1G=2G 的情況, 不過.... 發現把 heartbeat 跑起來後 (有兩台 firewall, 透過 heartbeat 處理), 在切換之後, 會變的很不正常, 封包狂掉... 完全不能運作.

google 找了一下, 與這個問題很類似. 不過這一個修正似乎還沒進到官方的 kernel 中. 我自己試著加上這個修正之後, 果然可以解決這個掉封包的問題.

目前用這方式跑了幾天, 看起來並沒有其他的問題, 進出看起來都可以達到 1G+1G 的效果. 而且.... 用這個方式, 並不需要任何 switch 上頭的支援, 也就是如果你是用一般沒支援 teaming 功能的 switch, 一樣可以使用.

這兒提到的都是頻寬合併的結果, 至於備援的運作, 我自己試過看起來也很正常. (不知道為什麼, 網路上看到的都是說做頻寬合併, 但是多數都只有設定, 沒有實際合併結果 (反而是有備援的測試結果).

要記得, 這兒所謂的 1G+1G=2G 之類的頻寬合併都是建立在不同的機器傳輸上頭, 如果你需要的是兩台機器之間互連要有頻寬合併的效果, 目前看起來 bonding 是無法做到的.... 我看直接升級到 10G 的網卡會比較快一些.

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] Re:Linux bonding [ 回覆 ]

請問balance-alb mode 會掉封包的狀況是如何解決的
方便透露一下嗎?

commons icon [2] Re:Linux bonding [ 回覆 ]

上頭的文章提到這個問題的地方有個 link 到 http://www.spinics.net/lists/netdev/msg184521.html 這個討論裡頭, 有個小修正加上就可以了.

commons icon [3] Re:Linux bonding [ 回覆 ]

不好意思!在打擾一下

所以說我只要把bond_main.c內,
在 !bond->params.fail_over_mac 後面加上&& !bond_is_lb(bond)這一段就可以解決掉封包的狀況嗎?

commons icon [4] Re:Linux bonding [ 回覆 ]

在我的環境是那樣處理就解決了.

commons icon [5] Re:Linux bonding [ 回覆 ]

我用的OS是redhat,或許有些許不同,不過我在try看看,感謝你的回覆!

迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 91 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS