Link Aggregation on FreeBSD多網卡合併 頻寬

(忘了當初引用的網址)

在研究所的時候就玩過在 FreeBSD 底下用多張網路卡跟 Switch 做 Link Aggregation,最近又有機會碰到,趁這個機會在這邊寫個 Note,順便把測試結果貼上來。

FreeBSD 可以用兩種不同的 Kernel Module 設定 Link Aggregation:ng_one2many 及 ng_fec。其中 ng_fec 在 FreeBSD 5 才有,如果你是使用 FreeBSD 4 的話,只能使用 ng_one2many。

這兩者最大的 不同就是,ng_one2many 不需要 Switch 支援 Link Aggregation,但是 ng_fec 則一定要和 Switch 一起搭配設定。在 FreeBSD 的 man page 中也有提到,建議是使用 Cisco 的 Switch,這應該也是 ng_fec 的名稱來源吧(Fast EtherChannel)!不過其實這邊也說了,這是「Fast」EtherChannel,一般都是用在 bundle 多張 10/100 Mb 的網路卡,但是現在 Gigabit 網路卡已經是普遍到氾濫,所以就拿 Gigabit 網路卡試試看是不是可以提高效能囉!

測試環境:

  • Switch:Cisco 3750G-24TS
  • Server:HP DL380G4 * 4 (t1, t2, t3, t4)
    • CPU:Xeon 3.2DP * 2
    • RAM:4G PC3200 DDR2
    • NIC 1:BCM 5704C Dual Port (on board) (bge driver)
    • NIC 2:Intel PRO / 1000 MT Dual Port (133 MHz PCI-X) (em driver)
  • Media:UTP,1000BaseTX Full-Duplex,Cat-6
  • OS:FreeBSD 5.4-RELEASE-p2
  • 測試軟體:iperf(其實還有很多測試軟體,像 netperf 也很好用,不過這只是大略的測試,不是要求很高啦,所以只用 iperf 測試)。

Config 內容:貼在這篇文章的最後面

測試結果:

 

bge * 1

em * 1

em * 2 (ng_one2many)

em * 2 (ng_fec)

結果說明:

  1. 關於 iperf 的執行參數都是用預設的,沒有額外指定:
    1. Server:iperf -s
    2. Client:iperf -t 120 -c {IP ADDRESS}
  2. 感覺 Intel 1000MT 的卡確實比 BCM 5704C 的卡效能來的優。
  3. 不過不知道是不是 Intel 卡上的 Chip 也是只有一顆,所以速度卡在 1Gb/s?
  4. 有沒有做 Link Aggregation 感覺差異不大,不知道是我設定有問題?還是這個測試方向根本就是錯的,或是沒意義的?  >_<
  5. 覺 得,除非 Chip 或是電腦處理網路的速度可以更快,不然用 Gigabit 網路卡做 Link Aggregation 除了可以增加 Availability 外,好像沒有多大的好處。看來在 Gigabit 的環境下,用好一點的 Server Adapter 真的比較重要。
  6. 在測試傳輸速度的時候,電腦的 Loading 或是 CPU idle 在相對應的測試下其實是差不多的(相差都在正負 3% 的範圍內),主要還是差在傳輸的效能,不過從我這邊記錄 loading 的資料看起來,bge 也比較吃系統資源(CPU idle 較少)。
  7. 也有測試過用 em0 + bge0 來做成一個 fec0 跑看看,結果測試出來的速度慘不忍睹阿,比單跑一張 bge0 還要來的慘。
  8. 至於為什麼不測試兩張 bge 做成 fec 呢?因為實在是懶得再測試了,覺得很浪費時間,所以就想說,單張卡 bge 比 em 差,兩張卡一起跑應該也是比較差吧?!  >_<

Cisco 3750 的設定檔:

Switch#conf t
Switch(config)#int range gi 1/0/1 – 2  (選要設定的 port)
Switch(config-if-range)#switchport mode access
Switch(config-if-range)#switchport nonegotiate
Switch(config-if-range)#channel-group 1 mode on (設為第1個 channel-group)
Switch(config-if-range)#exit

ng_one2many 的設定檔:

#!/bin/sh
/usr/sbin/ngctl mkpeer em0: one2many upper one
/usr/sbin/ngctl connect em0: em0:upper lower many0
/usr/sbin/ngctl connect em1: em0:upper lower many1

/usr/sbin/ngctl msg em1: setpromisc 1
/usr/sbin/ngctl msg em1: setautosrc 0

/usr/sbin/ngctl msg em0:upper setconfig
“{ xmitAlg=1 failAlg=1 enabledLinks=[ 1 1 1 1 ] }"

/sbin/ifconfig em0 {IP ADDRESS} netmask 0xffffff00 up
/sbin/route add default {DEFAULT GATEWAY}

ng_fec 的設定檔:

#!/bin/sh

/usr/sbin/ngctl mkpeer fec dummy fec
/usr/sbin/ngctl msg fec0: add_iface ‘"em0″‘
/usr/sbin/ngctl msg fec0: add_iface ‘"em1″‘
/usr/sbin/ngctl msg fec0: set_mode_inet

/sbin/ifconfig em0 promisc
/sbin/ifconfig em1 promisc
/sbin/ifconfig fec0 promisc

/sbin/ifconfig fec0 inet {IP ADDRESS} netmask 0xffffff00 up
/sbin/route add default {DEFAULT GATEWAY}