dpdk pmd

14
DPDK PMD Mar 6 2015, Masaru OKI (@masaru0714)

Upload: masaru-oki

Post on 16-Jul-2015

931 views

Category:

Software


2 download

TRANSCRIPT

DPDK PMDMar 6 2015, Masaru OKI (@masaru0714)

Data Plane Development Kithttp://dpdk.org/● ユーザーランドプログラムによる高速ネットワークI/Oライブラリ● 現時点での最新バージョンは1.8.0● Intelによって開発され、現在x86(32bit,64bit)とPower(64bit)で動作● Linux用。x86(64bit)についてはFreeBSDにも対応している● 指定コアを占有することによりコンテキストスイッチを回避● ハッシュテーブルやLongest Prefix Match等のユーティリティも提供● 割り込みを用いない高速I/Oデバイスドライバを提供している

○ Poll Mode Driver すなわちPMD

DPDK

DPDK

PMDの構造

Linux kernel

uio module (Linux標準)

igb_uio module

librte_pmd_e1000 librte_pmd_ixgbe librte_pmd_i40e and others

librte_ether (ユーザプログラムが呼び出す APIを提供する)

PCI vendor id, product idを識別し、PCIアドレス空間を提供する

仮想PMDはuioと無関係の存在

内部API登録

ユーザ空間で動作する、各種NIC向けのデバイスドライバ(物理PMD)

大きく2種類に分かれ、それぞれにいくつかの実装が用意されている。● 物理PMD

○ PCI上のデバイスのレジスタを読み書きし送受信を実現。○ 提供されているものは、ほぼIntel製品のみに対応している。○ vmxnet3などの準仮想化NICのドライバもこちら。○ 今後Mellanox製品やBroadcom 10GbEなどのPMDも提供予定。○ 自動選択。具体的にどのPMDを使っているか気にせずともよい。

● 仮想PMD○ 制御対象が物理NICでないドライバ。○ socketによる送受信、bonding、リングバッファによる折り返しなど。○ どのPMDをどれだけ使うかを指定する必要がある。

PMDの種類

librte_pmd_e1000 Intel GbE (8254x, 8257x, 82580, i350, i210など)librte_pmd_ixgbe Intel 10GbE (82598, 82599, X540, X550)librte_pmd_i40e Intel 40GbE (XL710)librte_pmd_virtio Virtio 準仮想化NIClibrte_pmd_vmxnet3vmxnet3 準仮想化NIClibrte_pmd_enic Cisco VIC Ethernet NIC (Cisco Linux製品に搭載)DPDK2.0で対応予定

librte_pmd_fm10k Intel Red Rock Canyon Switch integrated NIClibrte_pmd_mlx4 Mellanox ConnectX-3xx 10/40GbE

dpdk_nic_bind.pyにより、ドライバをigb_uioに切り替えて使用する

物理PMD

librte_pmd_af_packet AF_PACKETを使ったraw socketによる通信librte_pmd_bond 複数NICを束ねるBonding機能を提供librte_pmd_pcap libpcapを使ったraw socketによる通信librte_pmd_ring リングバッファによる折り返しlibrte_pmd_xenvirt Xen準仮想化NIC用ドライバ

DPDK2.0で対応予定librte_pmd_null 空パケットを受信し続け送信パケットを捨てる

通常はlibrte_pmd_XXXとは呼ばず、XXX PMDと呼ぶ。

現在は、DPDKアプリのコマンドラインで指定することで使用できる。指定しなければ、使用されない。

仮想PMD

● 送受信するポートを識別するための番号。ポート番号ともいう。● 0から順に割り当てられる。● 最初に、使用する仮想PMDの数だけ割り当てを行う。● その後unbindした物理NICの数だけ割り当てを行う。(PCIアドレス順)

○ PCIアドレスはethtool -i I/F名で確認できる。例

PCAP PMDでひとつ、物理NIC 00:14.0と00:15.0のふたつの場合port id 0: PCAP PMDport id 1: 00:14.0port id 2: 00:15.0

port id

DPDKコマンドラインにて下記を単数あるいは複数指定する。

--vdev PMDn,params[,params=value,...]

PMD PMDの識別名称。PCAP PMDであればeth_pcapn 複数指定する際の識別番号。0以上重複なし。params PMDごとに異なるパラメータ。カンマ区切りで複数指定可能。

仮想PMD指定方法

● 識別名称○ eth_af_packet

● 解説○ AF_PACKET socket, mmapを使用した送受信機能(Linuxのみ)○ PCAP PMDと機能は同様、PCAPより速いがVLANのケアなし

● 必須パラメータ○ iface=name インタフェース名を指定 iface=eth0

● オプションパラメータ○ qpairs=n キュー数を指定 qpairs=1○ blocksz=n ブロックサイズを指定 blocksz=4096○ framesz=n フレームサイズを指定 framesz=2048○ framecnt=n フレーム数を指定 framecnt=512

仮想PMD解説: AF_PACKET

● 識別名称○ eth_bond

● 解説○ 802.3ad LAGを提供する。

● パラメータ○ slave=PCIアドレス or name PMDのポートを指定(複数可)○ primary=PCIアドレス or name PMDをポートを指定(単数)○ mode=n モードを指定○ xmit_policy=l2 or l23 or l34 振り分けポリシーを指定○ socket_id=n 使用メモリの所属socketを指定○ mac=MACアドレス MACアドレスを指定

仮想PMD解説: BOND

● 識別名称○ eth_pcap

● 解説○ libpcapを用いた、raw socketによるパケット送受信を提供。○ Linuxで見えるeth0, eth1, p1p1等を使いそのまま通信可能とする。○ デフォルトではコンパイルされない点に注意。

● パラメータ○ iface=name○ インタフェース名を指定する。

● 使用例○ --vdev eth_pcap0,iface=eth1

仮想PMD解説: PCAP

● 識別名称○ eth_ring

● 解説○ 送信パケットを折り返し受信するテスト用ポートを提供。

● パラメータ○ 実用に供しないPMDのため略

仮想PMD解説: RING

● 識別名称○ eth_xenvirt

● 解説○ Xen準仮想化NICのPMDを提供する。○ デフォルトではコンパイルされない。

● パラメータ○ mac=MACアドレス

仮想PMD解説: XENVERT

● 識別名称○ eth_pipe

● 解説○ Lagopusに内蔵されている、2ポートを組にしてポート同士を接続した

形で動作するパイプ機能を提供するPMD。● パラメータ

○ socket=n 使用メモリの所属socketを指定● 使用例

○ --vdev eth_pipe0,socket=0■ --vdev指定ひとつで、port id 0, 1を作成する。■ 0に送信したパケットは1で受信。1に送信すれば0で受信。

仮想PMD解説: PIPE (Lagopus)