src
- FreeBSD with 10GbE network
10GbE対応のネットワークカードおよびスイッチングハブ、
ケーブルで構築された高速ネットワークでは、 システムを適切に設定することで理想的な速度での通信を実現できるようになります。たとえば、 最近の製品ではIntelの10GbEネットワークアダプタX540ファミリーなどが使われることが多いように思いますので、 このデバイスを設定を例にあげて紹介します。 10GbEのポートが2つ搭載されたX540-T2をFreeBSD 10-CURRENTで見ると、
次のようになります。ここでは片方のポートだけ結線しています。 $ ifconfig ix0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=403bb<RXCSUM,TXCSUM,VLAN_
MTU,VLAN_ HWTAGGING,JUMBO_ MTU,VLAN_ HWCSUM,TSO4,TSO6,VLAN_ HWTSO> ether a0:36:9f:12:fa:14 inet 192. 168. 1.1 netmask 0xffffff00 broadcast 192. 168. 1.255 inet6 fe80::a236:9fff:fe12:fa14%ix0 prefixlen 64 scopeid 0x1 nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_ LINKLOCAL> media: Ethernet autoselect (10Gbase-T <full-duplex>) status: active ix1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=403bb<RXCSUM,TXCSUM,VLAN_ MTU,VLAN_ HWTAGGING,JUMBO_ MTU,VLAN_ HWCSUM,TSO4,TSO6,VLAN_ HWTSO> ether a0:36:9f:12:fa:16 nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_ LINKLOCAL> media: Ethernet autoselect status: no carrier lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 options=600003<RXCSUM,TXCSUM,RXCSUM_ IPV6,TXCSUM_ IPV6> inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 inet 127. 0.0. 1 netmask 0xff000000 nd6 options=21<PERFORMNUD,AUTO_ LINKLOCAL> $ この状態で通信すると、
10GbEの論理速度から比べてだいぶ低い速度での通信しか実現できません。ドライバが使用するメモリ量の設定値を引き上げたり、 経路上のすべての機器でジャンボフレームを使用するように設定を変更する必要があります。 Intel製の10GbE NICに関する設定は/usr/
src/ sys/ dev/ ixgbe/ READMEに詳細が記述されていますので、 基本的にはこの内容にしたがってシステムを設定します。まず、 nmbclustersおよびnmbjumbo*の値を引き上げます。X540-T2を複数枚挿してある場合には、 そもそもこの値を引き上げないとネットワークアダプタとして使用できません。READMEに書いてあるように割り込みのメッセージも出力されると思いますので、 intr_ storm_ thresholdの値も説明にしたがって引き上げておきます。 /etc/ sysctl. confに追加する設定 kern.
ipc. nmbjumbo16=262144 kern. ipc. nmbjumbo9=262144 kern. ipc. nmbjumbop=262144 kern. ipc. nmbclusters=262144 hw. intr_ storm_ threshold=9000 次に、
ifconfigでIPを割り当てる段階で同時にmtuの値を指定します。指定できる値はデバイスごとに異なります。X540-T2の場合は16114です。デフォルトではこの値は1500と定められています。10GbEの通信速度に対して1500という値は小さすぎて性能を発揮できませんので、 こうした大きなサイズのmtuに変更して利用します。これがジャンボフレームです。 /etc/ rc. confによるインターフェースの設定例 ifconfig_
ix0="inet 192. 168. 1.1 netmask 255. 255. 255. 0 mtu 16114" 次のようにmtuの値が16114になっていることを確認します。
$ ifconfig ix0 ix0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 16114 options=403bb<RXCSUM,TXCSUM,VLAN_
MTU,VLAN_ HWTAGGING,JUMBO_ MTU,VLAN_ HWCSUM,TSO4,TSO6,VLAN_ HWTSO> ether a0:36:9f:12:fa:14 inet 192. 168. 1.1 netmask 0xffffff00 broadcast 192. 168. 1.255 inet6 fe80::a236:9fff:fe12:fa14%ix0 prefixlen 64 scopeid 0x1 nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_ LINKLOCAL> media: Ethernet autoselect (10Gbase-T <full-duplex>) status: active $ 通信経路をすべてジャンボフレームに対応させたら、
その経路が本当にジャンボフレームに対応したかを次のようにroute(8)コマンドで確認します。mtuの値が次のように引き上がっていれば設定は成功しています。mtuの値が1500になっている場合、 どこかで設定が失敗しています。 $ route get host2 route to: host2 destination: 192.
168. 1.0 mask: 255. 255. 255. 0 interface: ix0 flags: <UP,DONE> recvpipe sendpipe ssthresh rtt,msec mtu weight expire 0 0 0 0 16114 1 0 $ インターフェースのmtuを引き上げたのに、
route(8)が報告する経路のmtuの値が1500になっている場合には、 相手のインターフェースのmtuの設定がジャンボフレームになっているか、 間に挟まっているスイッチングハブがジャンボフレームの設定になっているか、 などを確認してください。 10GbEに対応したスイッチングハブは高価なため、
M/ Bに10GbEネットワークアダプタを複数枚挿してソフトウェア的にブリッジを構築するケースもあるでしょう。その場合、 すべてのインターフェースのmtuを引き上げないとbridge0のmtuが1500に固定化され、 ここがネックになって経路が1500に固定化されている可能性があります。次のようにブリッジのmtuの値もジャンボフレームへ引き上がっていることを確認してください。 $ ifconfig bridge0 bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 16114 ether 02:0f:da:aa:52:00 nd6 options=21<PERFORMNUD,AUTO_
LINKLOCAL> id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200 root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0 member: ix5 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP> ifmaxaddr 0 port 10 priority 128 path cost 20000 member: ix4 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP> ifmaxaddr 0 port 9 priority 128 path cost 20000 member: ix3 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP> ifmaxaddr 0 port 8 priority 128 path cost 20000 member: ix2 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP> ifmaxaddr 0 port 7 priority 128 path cost 20000 member: ix1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP> ifmaxaddr 0 port 2 priority 128 path cost 20000 member: ix0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP> ifmaxaddr 0 port 1 priority 128 path cost 20000 $ ifconfig(8)で設定を変更しても設定が反映されないという場合、
通信経路にあるすべてのマシンを一度再起動するといった処理をしてみてください。 このセットアップされた状態で、
ジャンボフレームに対応した通信を実施することで性能をフルに発揮できます。FreeBSDにインストールされているnc(1)は、 デフォルトの状態ではジャンボフレームに対応していませんが、 次のようにオプションを指定してビルドするとジャンボフレームに対応したnc(1)をインストールできます。 # cd /usr/
src/ usr. bin/ nc/ # make clean rm -f nc netcat. o atomicio. o socks. o nc. 1.gz nc. 1.cat. gz # make CFLAGS+=-DSO_ JUMBO # make install こうしてビルドしたnc(1)には-jというマニュアルには掲載されていないオプションを指定できるようになります。これは送り出すサイズをジャンボバッファと同じサイズに引き上げるというものです。先日紹介したネットワーク通信の方法を参考にして、
nc(1)で通信速度を計測してみてください。構成しているハードウェアによって左右されますが、 1GiB/ secの速度を超える通信を確認できると思います。 scp、
nc、 で紹介したのと同じ方法で通信速度を比較した例を次に示します。ftp、 NFSでデータ転送を実施する方法 図 計測結果 表 計測結果 転送方法 転送速度[MiB/ s] nc -j 1163 nc 832 ftp put 95. 3 scp 60. 2 NFS 326. 1 1000baseTの場合と異なり、
ジャンボフレームに対応していない状態のnc(1)やFTP、 NFSの速度に大きな違いがあることを確認できます。10GbEネットワークで通信を実施する場合、 ジャンボフレームに対応したネットワークを構築し、 ジャンボフレームに対応したプログラムを使って通信を実施することが、 高速通信を実現する鍵ということがいえます。