今回はOpenvSwitchのOVSDBという管理プロトコルのデータベースの操作をプログラマブルに行う手法を検討してみた。
OpenFlow コントローラフレームワークのRyuにはovs-vsctlというユーティリティライクにPythonからプログラマブルに操作するためのモジュール(vsctl.py)が用意されているのだが、QoSレコードの操作を行うには各種データベースコマンドを低レベルAPIを用いて設定することになり、少々面倒である。今回はQoSレコードを直感的に操作できるようにRyuのbridge.pyとvsctl.pyを変えてみた(粒度がovs-vsctlと少し変わってしまうのだが、提案してみるのもありかなと思った)
変更箇所は少し多いので、Patch形式で。
使い方は簡単で以下の通りとなる
ovsctl = bridge.OVSBridge(datapath.id, OVSDB_ADDR)
ovsctl.add_qos('s1-eth1', type='linux-htb',max_rate='100000000
', {'max-rate': '50000000', 'min-rate': '40000000'}, {'max-rate': '20000000', 'min-rate': '8000000'}])
tcの確認を行う。
$ sudo /sbin/tc qdisc show dev s1-eth1
qdisc htb 1: root refcnt 2 r2q 10 default 1 direct_packets_stat 0
$ sudo /sbin/tc class show dev s1-eth1
class htb 1:1 parent 1:fffe prio 0 rate 40000Kbit ceil 50000Kbit burst 1560b cburst 1950b
class htb 1:fffe root rate 100000Kbit ceil 100000Kbit burst 1500b cburst 1500b
class htb 1:2 parent 1:fffe prio 0 rate 8000Kbit ceil 20000Kbit burst 1563b cburst 3907b
queuesに設定しているリストはそれぞれqueue idが0,1で紐付けされている。
queue idはフローエントリーで振分ける場合に使用する。
実際にMininetで試してみた。
mininet> h1 iperf -s &
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
mininet> h2 iperf -c h1 -i 1 -t 10
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.2 port 60602 connected with 10.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 2.38 MBytes 19.9 Mbits/sec
[ 3] 1.0- 2.0 sec 2.25 MBytes 18.9 Mbits/sec
[ 3] 2.0- 3.0 sec 2.38 MBytes 19.9 Mbits/sec
[ 3] 3.0- 4.0 sec 2.25 MBytes 18.9 Mbits/sec
[ 3] 4.0- 5.0 sec 2.25 MBytes 18.9 Mbits/sec
[ 3] 5.0- 6.0 sec 2.38 MBytes 19.9 Mbits/sec
[ 3] 6.0- 7.0 sec 2.25 MBytes 18.9 Mbits/sec
[ 3] 7.0- 8.0 sec 2.38 MBytes 19.9 Mbits/sec
[ 3] 8.0- 9.0 sec 2.38 MBytes 19.9 Mbits/sec
[ 3] 9.0-10.0 sec 2.50 MBytes 21.0 Mbits/sec
[ 3] 0.0-10.1 sec 23.5 MBytes 19.5 Mbits/sec
フローエントリ
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x0, duration=189.757s, table=0, n_packets=10, n_bytes=668, priority=0 actions=CONTROLLER:65535
cookie=0x0, duration=174.478s, table=0, n_packets=17098, n_bytes=25777244, priority=1,in_port=2,dl_dst=22:cf:94:1e:8f:7c actions=set_queue:1,output:1
cookie=0x0, duration=174.516s, table=0, n_packets=8745, n_bytes=577286, priority=1,in_port=1,dl_dst=82:dc:88:71:d3:dd actions=set_queue:1,output:2
結果のとおりqueue_id:1には20Mbpsをmax-rateとして設定している為、期待どおりの動作となった。
今回はOVSDBをプログラマブルに扱う目的での考察であったが、今後もOF-CONFIGとOVSDBどちらも押さえていく必要があると考えている。やはり現状OpenvSwitchを利用するケースが圧倒的に多いと考えられる。したがって、OpenvSwitchの管理はOVSDBを使う必要があり、またプログラマブルに扱いたいという要求は必須である。したがって、クライアント側で柔軟に設定する為のAPIの充実も必要になるのではないかと考えている。
Comments
Add Comment