running lagopus on xeon d
TRANSCRIPT
Xeonとは
Intelのワークステーション、サーバー向けCPUブランドであり、中身は世代によってさまざま
1998年 Pentium II Xeonが最初の製品
現行品のグレードはE3, E5, E7に別れる
● 大雑把に言えばE3がCore i7相当以上● E5,E7はコア数増やSMP対応など
Xeon D
● Xeonブランドでは初のSoC (System on Chip)● 2015年1Q出荷● Broadwellベースでメモリコントローラを内蔵● 10GbE MACを2つ内蔵● 初期リリースは2モデル、TDPは45W
○ Xeon D-1540 8core 16thread, 2.0GHz○ Xeon D-1520 4core 8thread, 2.2GHz
Xeon Dマザーボード
● SUPERMICRO X10SDV-F, X10SDV-TLN4F○ 他社からもいくつか発表されている
● Mini-ITX, Xeon D-1540オンボード(ファンつき)● DDR4 ECC/nonECC DIMM x 4(max128GB)● IPMI対応● X10SDV-FはGbE * 2 (SoCの10GbEは未使用)● X10SDV-TLN4FはGbE * 2 + 10GbE * 2 (copper)
OSをインストールしてみる
● USB DVDドライブをつないでそこから入れる● 今回入れたOSはUbuntu 14.04.2LTS server
○ 10GbEは見えない可能性大なのでGbEを結線○ すんなり入った。○ GbEはem0, em1○ 10GbEは予想通り見えなかった
Xeon Dの性能はどの程度?
● ループバックインタフェースにiperfする○ CPU処理速度とメモリアクセスの測定になります○ 10GbE扱える力があるか確認してみようという趣旨
● iperf: ネットワークスループットの測定ツール○ iperf -sを動かすホストとiperf -cの間の計測○ 単一あるいは複数セッションをTCP, UDPで計測できる○ 負荷がかかるのでLANの測定にとどめましょう○ 今回は同一ホストでiperf -sとiperf -cを動かす
性能比較(clockあたりの速度を計算)
Broadwell, Haswell, IvyBridgeの順
Xeon D優秀。
Atomはやや落ちる。
AMDは参考値
● CPU自体古い● OSがNetBSD● メモリもDDR2
iperfによる性能比較(表)
メモリはDDR3(例外 Xeon DがDDR4, AMDがDDR2)CPU iperf speed (Gbps) CPU clock(GHz) Gbps/clock
Xeon E3-1231v3 63.8 3.4 18.76
Xeon D-1540 39.7 2.0 19.85
Xeon E3-1105Cv2 25.7 1.8 14.27
Atom C2758 13.8 2.4 5.75
Celeron J1900 12.3 2.0 6.15
PhenomII X6 1095T 8.36 3.2 2.61
SoC内蔵10GbE(10GBaseT)が使えるか?
● Ubuntu 14.04LTSからは見えなかったorz● 新しいLinux kernelからも見えない
○ 少なくとも、PCI IDが未知と思われる
● Intel DPDKは2015年6月10日時点で未対応○ X540ベースだがcopper PHYを扱えない○ 使う設定で起動させるとエラー終了してしまう
LinuxのI/Fとして認識させる
IntelがLinuxドライバのソースを配布しているhttps://downloadcenter.intel.com/ja/download/24941
利用条件に同意してダウンロード、展開して
cd src; sudo make installrmmod ixgbe; modprobe ixgbe
見えました(Ubuntu 14.04.2LTSにて)$ ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 1000baseT/Full
10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 1000baseT/Full
10000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Speed: 10000Mb/s
em0: i350 (GbE)em1: i350 (GbE)eth0: X540 (10GbE)eth1: X540 (10GbE)
netnsを使って動作確認
1. sudo ip netns exec NET0 iperf -s2. sudo ip netns exec NET1 iperf -c 172.21.0.1------------------------------------------------------------
Client connecting to 172.21.0.1, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 172.21.0.2 port 52119 connected with 172.21.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 10.9 GBytes 9.40 Gbits/sec
DPDKでXeon D 10GbEを動かす
● DPDKのドライバ(PMD)はFreeBSDベース● FreeBSD-CURRENTがXeon D対応している!
○ 2015年5月1日にXeon D対応コードがcommitされた
● コードを持ってきて移植(ほぼパクり)
無事認識しました
EAL: PCI device 0000:03:00.0 on NUMA socket 0EAL: probe driver: 8086:15ad rte_ixgbe_pmdEAL: PCI memory mapped at 0x7fffc0000000EAL: PCI memory mapped at 0x7fffc0200000PMD: eth_ixgbe_dev_init(): MAC: 7, PHY: 6PMD: eth_ixgbe_dev_init(): port 0 vendorID=0x8086 deviceID=0x15adEAL: PCI device 0000:03:00.1 on NUMA socket 0EAL: probe driver: 8086:15ad rte_ixgbe_pmdEAL: PCI memory mapped at 0x7fffc0204000EAL: PCI memory mapped at 0x7fffc0404000PMD: eth_ixgbe_dev_init(): MAC: 7, PHY: 6PMD: eth_ixgbe_dev_init(): port 1 vendorID=0x8086 deviceID=0x15ad
DPDKの変更部分のコード
DPDKのdiffをいちおう用意した
Intelさんが公式に対応パッチを入れてくれるはず
と思って1ヶ月、まだ入らないのでこっそり公開https://gist.github.com/iMasaruOki/682cb95779de39b38bdf
待てない+試してみたい方はどうぞ(もちろん無保証ですが)
当時のmaster向けなのでrejectしたら手でなおしてください
Lagopusで10GbEの動作確認
● OpenFlowソフトウェアスイッチ○ コントローラと制御通信する○ コントローラからの指示でパケット送信可能○ 受信パケットの処理ルールをコントローラから登録
● 論理上複数のスイッチを扱える● 2つのスイッチそれぞれに10GbEを割り当てる● 2つの10GBaseTポートをケーブルで接続● スイッチ間の通信ができるかを確認してみる
Lagopus動作確認テストの構成
Xeon Dマシン
Lagopus(単一プロセス動作)
bridge-1
bridge-2
10GbE portid 0
10GbE portid 1DPDK
Ryu(OFコントローラ)
Lagopus実行
$ sudo lagopus -d -- -cff -n2 -- -p3(中略)NIC RX ports: port 0 (queue 0) port 1 (queue 0)(中略)NIC TX ports: 0 1
OpenFlowテストを実行 (一部抜粋)action: set_field: 38_TUNNEL_IDethernet/ipv4/tcp-->'actions=set_field:12345->tunnel_id,goto_table:1','table_id:1,tunnel_id=12345,actions=output:2' OKethernet/ipv6/tcp-->'actions=set_field:12345->tunnel_id,goto_table:1','table_id:1,tunnel_id=12345,actions=output:2' OKethernet/arp-->'actions=set_field:12345->tunnel_id,goto_table:1','table_id:1,tunnel_id=12345,actions=output:2' OKgroup: 00_ALL..........2Mbps(ethernet/ipv4/tcp)-->'in_port=1,actions=group:all(actions=output:2/actions=output:3)' OK