FreeBSD Daily Topics

2012年10月3日FreeBSDで10GbEネットワークを活用する

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 -j1163
nc832
ftp put95.3
scp60.2
NFS326.1

1000baseTの場合と異なり、ジャンボフレームに対応していない状態のnc(1)やFTP、NFSの速度に大きな違いがあることを確認できます。10GbEネットワークで通信を実施する場合、ジャンボフレームに対応したネットワークを構築し、ジャンボフレームに対応したプログラムを使って通信を実施することが、高速通信を実現する鍵ということがいえます。

おすすめ記事

記事・ニュース一覧