POSTS
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) |
結果說明:
- 關於 iperf 的執行參數都是用預設的,沒有額外指定:
- Server:iperf -s
- Client:iperf -t 120 -c {IP ADDRESS}
- 感覺 Intel 1000MT 的卡確實比 BCM 5704C 的卡效能來的優。
- 不過不知道是不是 Intel 卡上的 Chip 也是只有一顆,所以速度卡在 1Gb/s?
- 有沒有做 Link Aggregation 感覺差異不大,不知道是我設定有問題?還是這個測試方向根本就是錯的,或是沒意義的? >_<
- 覺 得,除非 Chip 或是電腦處理網路的速度可以更快,不然用 Gigabit 網路卡做 Link Aggregation 除了可以增加 Availability 外,好像沒有多大的好處。看來在 Gigabit 的環境下,用好一點的 Server Adapter 真的比較重要。
- 在測試傳輸速度的時候,電腦的 Loading 或是 CPU idle 在相對應的測試下其實是差不多的(相差都在正負 3% 的範圍內),主要還是差在傳輸的效能,不過從我這邊記錄 loading 的資料看起來,bge 也比較吃系統資源(CPU idle 較少)。
- 也有測試過用 em0 + bge0 來做成一個 fec0 跑看看,結果測試出來的速度慘不忍睹阿,比單跑一張 bge0 還要來的慘。
- 至於為什麼不測試兩張 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 em0:upper setconfig
/sbin/ifconfig em0 {IP ADDRESS} netmask 0xffffff00 up |
<p>
ng_fec 的設定檔:
</p>
<p>
<font face="courier new,courier,monospace">#!/bin/sh</font>
</p>
<p>
<font face="courier new,courier,monospace">/usr/sbin/ngctl mkpeer fec dummy fec<br /> /usr/sbin/ngctl msg fec0: add_iface ‘”em0″‘<br /> /usr/sbin/ngctl msg fec0: add_iface ‘”em1″‘<br /> /usr/sbin/ngctl msg fec0: set_mode_inet</font>
</p>
<p>
<font face="courier new,courier,monospace">/sbin/ifconfig em0 promisc<br /> /sbin/ifconfig em1 promisc<br /> /sbin/ifconfig fec0 promisc</font>
</p>
<p>
<font face="courier new,courier,monospace">/sbin/ifconfig fec0 inet {IP ADDRESS} netmask 0xffffff00 up<br /> /sbin/route add default {DEFAULT GATEWAY}</font>
</p>
<div class="wp_plus_one_button" style="margin: 0 8px 8px 0; float:left; ">
<g:plusone href="https://blog.sd.idv.tw/archives/19" callback="wp_plus_one_handler"></g:plusone>
</div>