#6 LinuxカーネルのBridgeとDPDK (testpmd) の性能比較
はじめに
これまでは以下の図のようにNICをDPDKで制御して、パケットを転送しました。
今回は同じことを次の図のようにLinuxカーネルを使って行ってみます。
Linuxカーネルを使う設定
これまでの方法でNICをDPDKにバインドしていたのであれば、再起動するとNIC(X540-AT2)用のカーネルドライバがロードされます。再起動せずに、コマンドラインで行う場合、以下のように入力します。
/usr/local/sbin/dpdk-devbind -b ixgbe 0000:01:00.0 0000:01:00.1
引数最後のPCIバスアドレスの部分は必要に応じて適宜変更してください。NICの状態を確認すると、以下のようにNetwork devices using kernel driverに変更されたことが分かります。また、水色にしたInterface名を後で使います。
# /usr/local/sbin/dpdk-devbind -s
Network devices using DPDK-compatible driver
============================================
<none>
Network devices using kernel driver
===================================
0000:01:00.0 'Ethernet Controller 10-Gigabit X540-AT2' if=enp1s0f0 drv=ixgbe unused=igb_uio
0000:01:00.1 'Ethernet Controller 10-Gigabit X540-AT2' if=enp1s0f1 drv=ixgbe unused=igb_uio
0000:03:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller' if=enp3s0 drv=r8169 unused=igb_uio *Active*
(省略)
これでNIC (X540-AT2)がLinuxの管理下になったので、次のようにブリッジを作成できます。ブリッジ名をここではbrtestにします。
# brctl addbr brtest
# brctl addif brtest enp1s0f0
# brctl addif brtest enp1s0f1
成功すれば下記のように表示されるはずです。
# brctl show
bridge name bridge id STP enabled interfaces
brtest 8000.a0369f64cc84 no enp1s0f0
enp1s0f1
NICとブリッジを有効にします。
[opy6]~ # ip link set enp1s0f0 up
[opy6]~ # ip link set enp1s0f1 up
[opy6]~ # ip link set brtest up
評価結果
それでは、ホスト1でpktgenを動作させてます。方法は第5回のそれと同じでrangeモードを使用します。以下に結果を記載します。一番右のDPDK (2Q1P)列は、第5回の結果を転載しています。
パケットサイズ |
Gbps | Mpps | ||
Linux Bridge | DPDK (2Q1P) | Linux Bridge | DPDK (2Q1P) | |
64 | 2.98 | 15.2 | 4.43 | 22.6 |
128 | 5.61 | 19.4 | 4.74 | 16.4 |
256 | 9.16 | 20.0 | 4.15 | 9.06 |
512 | 16.4 | 未計測 | 3.85 | 未計測 |
1024 | 20.0 | 未計測 | 2.39 | 未計測 |
パケットサイズが小さい時、Linux Bridgeを用いた構成より、DPDKを使ったほうが数倍も性能が高いことが分かりました。一方でパケットサイズ1024バイトになると、Linux Bridgeでもラインレートに達しています。
なお、GbpsからMppsへの変換は次のように行いました。PktSizeに加えている20は、Ethernetフレームのプリアンブルとインターフーレムギャップのサイズです。
次回は、DPDKを使ったOpen vSwitchを試してみます。