lagopus+pcap pmd
DESCRIPTION
Lagopus Day #2 YokohamaのLTで発表した資料です。TRANSCRIPT
Lagopus+PCAP PMDSep 27, 2014Masaru OKI@masaru0714 [email protected]
Lagopus
● オープンソースのOpenFlowスイッチ実装● Linuxで動く (今回はUbuntu14.04LTSを使用)● Intel DPDKを足回りに使っている
● 今回はDPDKの特徴であるPMDを利用する● 対象DPDKは1.7.0
○ 古いバージョンでは指定方法など違っているので注意
PMD
● Poll Mode Driver○ 通常LANのドライバはカーネルが持っている○ DPDKではこれをアプリケーション側で実行する○ その際に割り込み駆動せず、ポーリングする
● 通常PMDは物理NICのチップ毎に用意される○ DPDKがNICの種類に応じて使うPMDを自動選択
● 特殊なPMDがいくつか用意されている○ 今回はそのなかの一つであるPCAP PMDを使う○ 他にはbonding PMD, ring PMDがある
PCAP PMD
● 通常のNIC用PMD○ eth0などのi/fを通常のカーネル管理から外して、DPDK
専用のuioドライバに差し替えて使う○ ちょっぱや(性能チューニングされまくってる)
● PCAP PMD○ eth0などをカーネル管理のまま、libpcapを使うことで
PF_PACKETやBPFなどを用いて通信するPMD○ 速度は期待できない代わりに応用範囲が広い
絵にするとこう
※おおまかなイメージです
application
eth0
packets
DPDK application
eth0
packets
igb_uio
DPDK igb PMD
DPDK application
eth0
packets
DPDK pcap PMD
kernel, driver
userland
通常(DPDK未使用) DPDK+物理NIC DPDK+PCAP PMD
PCAP PMDの使い方
app -c7 -n2 --vdev eth_pcap0,iface=eth0 ...● --vdev PMD名,パラメータ[, …]
○ --vdevは複数書ける (eth_pcap1, …)● I/Fの並びとして、物理NICの前に挿入される
○ lagopusで指定すると
PortID0=pcap0, PortID1=物理NIC1本目, となる。(lagopus.confではPortID0をeth0と表現する)
○ デフォルトではOpenFlow Port1=PortID0
動作実験概要
● Host-DUT間でtunnelを3本張る(今回はVXLAN)○ L2encapするtunnel I/Fなら別protocolでもできるはず
● Lagopus視点で3本足にし、Ryuテストを実行○ Host, DUTともにPCAP PMDを使うLagopus
● 物理線は1本で構築できる
DUTtarget sw
Hosttester sw
VXLAN VNI=0 (portid0)
VXLAN VNI=1 (portid1)
VXLAN VNI=2 (portid2)
実験前に、ハマりそうなところの確認
● 実は、PCAP PMDにはバグがある○ 少なくとも1.7.0までのDPDKでは、PCAP PMD受信パケッ
トデータの中の受信ポート番号の値がすべて0xffになる○ 現在のLagopusはこの情報を参照している○ PCAP PMDのコードを修正する必要がある(3行追加)
● VXLANをupしたらIPv6のDAD等をしゃべるかも○ v6が流れるとRyuのパケットに紛れてテストがfailする○ →Ubuntuでやってみたら、しゃべらない模様。○ よかった☆
PCAP PMDを使用する準備
● PCAP PMDは標準でビルドされていない○ DPDKのconfigを編集してビルドしておく
■ RTE_SDK=$HOME/src/dpdkのと
き、$RTE_SDK/config/common_linuxappを編集■ 下記の行が=nとなっているので、=yに変更■ CONFIG_RTE_LIBRTE_PMD_PCAP=y
○ 修正を忘れずに
● DPDKビルド後、Lagopusをビルド
VXLAN I/Fの作成、設定
● いろいろサボっているところは気にしない● 古いとサポートされてないので注意
ip link add vxlan0 type vxlan id 0ip link add vxlan1 type vxlan id 1ip link add vxlan2 type vxlan id 2ip link set up vxlan0ip link set up vxlan1ip link set up vxlan2
Ryuテストアプリの起動
● 実行ホストはどちらでもいい○ lagopus.confのcontroller指定を合わせる
● あらかじめryuをgit cloneしてあればcd src/ryuryu-manager tester.py
● pipでインストールした場合は/usr/local/lib/の下あたりにtester.pyやテストケースが入っているので、そこにcdして実行するか、パスを与える
Lagopusの起動
● 4コア指定で起動の場合sudo lagopus -d -- -cf -n2 --vdev eth_pcap0,iface=vxlan0 --vdev eth_pcap1,iface=vxlan1 --vdev eth_pcap2,iface=vxlan2 -- -p7
● 入力時は1行で● lagopus.confは略● 双方ホストで起動しRyuとつながるとテスト開始● group,meter込みだとテスト完了まで約30分
実行結果
本日の実験……失敗
● 突貫作業すぎた(昨晩思いついて始めた)● Fedora20-Ubuntu14.04LTSでつなごうとした● VXLAN設定自体初めて● Port番号が合っていない疑惑、調査時間切れ● Ubuntu入れようとしてFedora partition壊す● あわてるとろくなことがない、作業は計画的に