« 2万円で OpenFlow スイッチを自作しよう | トップページ | OpenFlowスイッチ(Open vSwitch)の性能測定 (続編) »

2013年2月11日 (月)

OpenFlowスイッチ(Open vSwitch)の性能測定

前回の記事で作成した OpenFlow スイッチの性能テストをしてみました。

テスト環境の構成は前回の記事を参照ください。測定は iperf コマンドを用いて、ホスト1(192.168.0.1)をサーバ、ホスト2(192.168.0.2)をクライアントとして動かしています。UDP のテストの時は、"-b 100M" をつけて 100Mbps の帯域を指定しています。

以下、出力結果はすべてホスト2(192.168.0.2)側で実行した結果です。

■テストケース
以下の3つを試しました。
(1) ホスト1 とホスト2 をクロスケーブルで直結して OpenFlow スイッチを間にはさまずにテスト。
(2) OpenFlow スイッチでリピーターハブを動かしてテスト。
(3) リピーターハブを改造し、全パケットを OpenFlow コントローラに送るようにしてテスト。

■結論:
(1) テストケース1→2→3 と ping の応答は落ちておりやることが増えればターンアラウンドタイムは悪くなっている。
(2) その一方、スループットは大差なし。物理的な制約(100Mbpsのイーサネット)の方が大きいのではないかと思われます。

■テストケース1
ホスト1 とホスト2 を OpenFlow スイッチを使わずにクロスケーブルで直結してテスト。
まずはベースとなる性能の確認です。

(1) Ping

$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=0.432 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=64 time=0.272 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=64 time=0.287 ms
64 bytes from 192.168.0.1: icmp_req=4 ttl=64 time=0.278 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.272/0.317/0.432/0.067 ms

(2) TCP

$ iperf -c 192.168.0.1
------------------------------------------------------------
Client connecting to 192.168.0.1, TCP port 5001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 57812 connected with 192.168.0.1 port 5001
[ ID] Interval      Transfer   Bandwidth
[  3]  0.0-10.0 sec   113 MBytes  94.7 Mbits/sec

(3) UDP

$ iperf -c 192.168.0.1 -u -b 100M
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  160 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 38938 connected with 192.168.0.1 port 5001
[ ID] Interval      Transfer   Bandwidth
[  3]  0.0-10.0 sec   114 MBytes  95.7 Mbits/sec
[  3] Sent 81409 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   114 MBytes  95.6 Mbits/sec   0.034 ms   66/81408 (0.081%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

■テストケース2
OpenFlow スイッチで「5行で書いたリピーターハブ」を動かしてテスト。

Tremaで実行したコード:

class RepeaterHub < Controller
  def switch_ready( datapath_id )
    send_flow_mod_add( datapath_id, :actions => SendOutPort.new( OFPP_FLOOD ) )
  end
end

(1) Ping

$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=1.70 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=64 time=0.759 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=64 time=0.593 ms
64 bytes from 192.168.0.1: icmp_req=4 ttl=64 time=0.596 ms
64 bytes from 192.168.0.1: icmp_req=5 ttl=64 time=0.662 ms
^C
--- 192.168.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4001ms
rtt min/avg/max/mdev = 0.593/0.862/1.704/0.426 ms

(2) TCP

iperf -c 192.168.0.1
------------------------------------------------------------
Client connecting to 192.168.0.1, TCP port 5001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 57816 connected with 192.168.0.1 port 5001
[ ID] Interval      Transfer   Bandwidth
[  3]  0.0-10.0 sec   113 MBytes  94.4 Mbits/sec

(3) UDP

$ iperf -c 192.168.0.1 -u -b 100M
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  160 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 40979 connected with 192.168.0.1 port 5001
[ ID] Interval      Transfer   Bandwidth
[  3]  0.0-10.0 sec   114 MBytes  95.8 Mbits/sec
[  3] Sent 81450 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   114 MBytes  95.5 Mbits/sec   0.051 ms   10/81449 (0.012%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

■テストケース3
「5行で書いたリピーターハブ」を改造し、全パケットを OpenFlow コントローラに「も」送るようにしてテスト。
パケットがコントローラに飛ぶことでの影響を確認しようと思ってやってみました。

Tremaで実行したコード:

class RepeaterHubWithPacketIn < Controller
  def switch_ready( datapath_id )
    send_flow_mod_add(
      datapath_id,
      :actions => [
        SendOutPort.new( OFPP_CONTROLLER ),
        SendOutPort.new( OFPP_FLOOD )
      ]
    )
  end
end

(1) Ping

$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=1.03 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=64 time=0.695 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=64 time=0.823 ms
64 bytes from 192.168.0.1: icmp_req=4 ttl=64 time=0.782 ms
64 bytes from 192.168.0.1: icmp_req=5 ttl=64 time=0.834 ms
^C
--- 192.168.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 0.695/0.832/1.030/0.115 ms

(2) TCP

$ iperf -c 192.168.0.1
------------------------------------------------------------
Client connecting to 192.168.0.1, TCP port 5001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 57819 connected with 192.168.0.1 port 5001
[ ID] Interval      Transfer   Bandwidth
[  3]  0.0-10.0 sec   113 MBytes  94.5 Mbits/sec

(3) UDP

$ iperf -c 192.168.0.1 -u -b 100M
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  160 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 42176 connected with 192.168.0.1 port 5001
[ ID] Interval      Transfer   Bandwidth
[  3]  0.0-10.0 sec   114 MBytes  95.7 Mbits/sec
[  3] Sent 81410 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   113 MBytes  94.8 Mbits/sec   0.065 ms  549/81409 (0.67%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

95Mbits/sec 台が出ていないので再度やり直しました。

(4) UDP 再度

$ iperf -c 192.168.0.1 -u -b 100M
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  160 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 33369 connected with 192.168.0.1 port 5001
[ ID] Interval      Transfer   Bandwidth
[  3]  0.0-10.0 sec   114 MBytes  95.7 Mbits/sec
[  3] Sent 81406 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   114 MBytes  95.4 Mbits/sec   0.034 ms   20/81405 (0.025%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

今度は、95Mbits/sec 台が出ています。

■補足: ホスト1側で実行したコマンドについて

ホスト1 側で iperf をサーバとして起動した時のコマンドは以下の通りです。

TCP での測定の時:

$ iperf -s

UDP での測定の時:

$ iperf -s -u

« 2万円で OpenFlow スイッチを自作しよう | トップページ | OpenFlowスイッチ(Open vSwitch)の性能測定 (続編) »

OpenFlow」カテゴリの記事

Trema」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: OpenFlowスイッチ(Open vSwitch)の性能測定:

« 2万円で OpenFlow スイッチを自作しよう | トップページ | OpenFlowスイッチ(Open vSwitch)の性能測定 (続編) »

最近のトラックバック

無料ブログはココログ