bridge + tapとmacvtapの比較

macvtapはbridge + tapより軽くて速いんだと説明されている事があるが、本当かよと思ってちょっと比較してみた。

rx_handler実行にかかる所要時間

__netif_receive_skbで呼ばれるrx_handlerの処理(bridgeだとbr_handle_frame〜wake_up_interruptible_poll、macvtapだとmacvlan_handle_frame〜wake_up_interruptible_poll)にかかる所要時間をsystemtapで測ってみた。

bridge_time.stp
global time
probe module("bridge").function("br_handle_frame").call {
      time[cpu()] = gettimeofday_ns();
}

probe module("bridge").function("br_handle_frame").return {
      if ($return == 0)
            printf("%d\n", gettimeofday_ns() - time[cpu()]);
macvtap_time.stp
global time
probe module("macvlan").function("macvlan_handle_frame").call {
      time[cpu()] = gettimeofday_ns();
}

probe module("macvlan").function("macvlan_handle_frame").return {
      if ($return == 0)
            printf("%d\n", gettimeofday_ns() - time[cpu()]);
}
結果

KVMを立ち上げtapデバイスと繋ぎ、VM-ホスト間にiperfでTCPストリームを継続的に流している状態で、測定値を500000行表示させて平均を取った。

macvtap 420.56 ns
bridge+tap 2446.8 ns

確かにmacvtapの方が軽い。

パケットフォワーディング時のスループット

KVMに二本のインタフェースを生やして外からpktgenでパケットを送り込んだ時の性能の差を調べてみた。

結果


macvtapの方が明らかに速い。

iperfのスループット

外のノードでiperf -cを立ち上げ、KVM上のiperf -sへ接続してスループットを計測した。

TCP 1500byteの時

UDP 12byteの時

なんか良く分からん結果になった。。。