09.01.2015 Views

Introduction_to_Intel_DPDK_v2

Introduction_to_Intel_DPDK_v2

Introduction_to_Intel_DPDK_v2

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Introduction</strong> <strong>to</strong><br />

<strong>Intel</strong> <strong>DPDK</strong><br />

Oct 24 th , 2014<br />

IGEL Co.,Ltd.<br />

Tetsuya Mukawa<br />

武 川 哲 也


はじめに<br />

Q: <strong>Intel</strong> <strong>DPDK</strong>( 以 下 、<strong>DPDK</strong>)って<br />

A: 高 スループット/ 低 レイテンシのネットワークを 実 現 する 仕 組 みです。<br />

Q: <strong>DPDK</strong>の 目 的 は<br />

A: 高 価 なNW 機 器 と 同 等 の 機 能 ・ 性 能 を、Linux/BSD 上 のソフトウェアで 実 現 することです。<br />

Q: <strong>DPDK</strong>は、サーバ 用 途 の 技 術 では<br />

A: 今 のところ、その 通 りです。<br />

Q: なぜ、CELFで<br />

A: 高 速 化 手 法 が 面 白 いので 紹 介 します。<br />

Q: あなたは 誰 <br />

A: 組 込 みエンジニアです。たまに、CELFに 参 加 しています。<br />

2


<strong>DPDK</strong>の 衝 撃 1 ~ 高 速 転 送 ~<br />

• 公 称 、”Over 160Mpps(fps)”<br />

– 64byte(ショート)パケットで、 約 80Gbps<br />

– 1024byteパケットで、 約 1300Gbps<br />

通 信 事 業 にとっては、<br />

ショートパケットのパ<br />

フォーマンスが 重 要 らしい<br />

( 聞 いた 話 )<br />

現 在 手 に 入 るNICの 最 速<br />

は40Gbps()<br />

– というわけで、160Mppsは、 信 じられないくらい 速 い。<br />

• 信 じられないので、 調 べてみました( 後 述 )。<br />

4


<strong>DPDK</strong>の 衝 撃 2 ~ 安 価 ~<br />

• BSDライセンス<br />

• Linux/BSD 上 で 動 作<br />

• x86だけでなく、ARMやPower 上 でも 動 作<br />

– ATOMも<br />

• 専 用 機 器 に 比 べて 非 常 に 安 価 なサーバ 上 で、 専 用<br />

機 器 と 同 等 の 性 能 ・ 機 能 を 持 つネットワーク 機 器 を 作<br />

成 することが 可 能 に。<br />

– ネットワーク 業 界 に 大 きなインパクト<br />

5


<strong>DPDK</strong>の 生 まれた 背 景<br />

~ 想 像 です~<br />

【 通 信 事 業 者 】<br />

最 近 では・・・<br />

Linaro<br />

IBM<br />

ARMポーティングは、Linaro 主 導<br />

https://wiki.linaro.org/LNG/Engineering/<strong>DPDK</strong><br />

NW 専 用 機 器 は 高 す<br />

ぎる<br />

【<strong>Intel</strong>】<br />

自 社 のCPUやNIC<br />

を 売 りたい<br />

【ソフトウェア 会 社 】<br />

寡 占 だったNW 専<br />

用 機 器 にビジネ<br />

スチャンス<br />

<strong>DPDK</strong> 初 期 では・・・<br />

6WIND<br />

Wind River<br />

Powerポーティングは、IBM 主 導<br />

7


<strong>DPDK</strong>の 歴 史<br />

年 月 バーション 拡 張 された 機 能<br />

2012 年 11 月 <strong>DPDK</strong>-1.2.3<br />

2013 年 6 月 <strong>DPDK</strong>-1.3.1<br />

2013 年 8 月 <strong>DPDK</strong>-1.4.1<br />

2013 年 9 月 <strong>DPDK</strong>-1.5.0<br />

2013 年 10 月 <strong>DPDK</strong>-1.5.1<br />

2014 年 1 月 <strong>DPDK</strong>-1.6.0<br />

2014 年 6 月 <strong>DPDK</strong>-1.7.0<br />

2014 年 11 月 <strong>DPDK</strong>-1.8.0<br />

VMとの<br />

通 信 拡 張<br />

数 種 の 仮 想<br />

デバイスサ<br />

ポート<br />

機 能 の 詳 細 につ<br />

いては 後 述<br />

アプリ 制 作 に<br />

便 利 なライブ<br />

ラリの 追 加<br />

比 較 的 、 新 しい<br />

ソフトウェア<br />

最 近 になって、アプリ 用 のライブラリ<br />

が 充 実 してきている<br />

8


コミュニティ<br />

<strong>DPDK</strong>-1.4<br />

<strong>DPDK</strong>-1.6<br />

<strong>Intel</strong>の 対 応<br />

6WINDの 対 応<br />

利 用 者 の 反 応<br />

<strong>Intel</strong>の 対 応<br />

• <strong>Intel</strong>の 公 式 サイト<br />

にて、ソースコード<br />

のみ 公 開<br />

• gitは 非 公 開<br />

• dpdk.orgを 立 ち 上<br />

げ、 独 自 にMLとgit<br />

を 提 供<br />

• <strong>Intel</strong>のソースから<br />

作 成 したgit tree<br />

• dpdk.orgにpatchを<br />

投 稿<br />

• <strong>Intel</strong>の<strong>DPDK</strong>-1.5<br />

より、dpdk.orgの<br />

<strong>DPDK</strong>-1.5の 方 が<br />

高 機 能 に。<br />

• dpdk.orgを 公 式<br />

なgitと 認 定<br />

• <strong>Intel</strong> 自 身 も、<br />

dpdk.orgに 投 稿<br />

• メンテナは、<strong>Intel</strong><br />

ではなく、6WIND<br />

コミュニティでは、<strong>Intel</strong>と 共 に<br />

6WINDにも 存 在 感<br />

9


概 要<br />

~ 既 存 フレームワークによる 転 送 の 限 界 ~<br />

• 例 えばLinuxでは、1Mpps 以 下<br />

– 1500byte 程 度 のパケットでも、 実 測 10Gbpsを 下 回 るらしい。<br />

• 既 存 デバドラによる 転 送 はなぜ 遅 いか<br />

– 割 り 込 みによるオーバーヘッド<br />

– コンテキストスイッチのオーバーヘッド<br />

– TLBミス<br />

– (CPU Coreの)キャッシュミス<br />

11


概 要<br />

~<strong>DPDK</strong>のアーキテクチャ( 超 基 本 )~<br />

• uio/vfioを 使 ったユーザースペースデバイスドライバと<br />

ライブラリ<br />

– ( 主 に)<strong>Intel</strong>のNIC 対 象<br />

• ユーザ 空 間 から 独 自 のリソース 管 理<br />

– コア<br />

– メモリ<br />

• 独 自 のメモリ 管 理 の 仕 組 みを 構 築<br />

サーバ 対 象 のソフトウェアなのに、<br />

uio/vfioと 組 込 みみたい<br />

12


概 要<br />

~ブロック 図 ~<br />

<strong>DPDK</strong> Application<br />

<strong>DPDK</strong> EAL<br />

ポーリングで 動 作 す<br />

るアプリケーション<br />

ポーリング 動 作 する<br />

デバイスドライバ<br />

(PMD)<br />

コアを 占 有 。コンテ<br />

キストスイッチさせな<br />

い=ポーリング<br />

etc...<br />

ポート 管 理<br />

user level<br />

device driver<br />

コア 管 理<br />

バッファ 管 理<br />

キュー 管 理<br />

メモリ 管 理<br />

キャッシュラインまで<br />

意 識 したバッファの<br />

管 理<br />

ロックレスなキュー<br />

独 自 のメモリ 管 理 機<br />

構 を 構 築<br />

uio / vfio<br />

CPU<br />

affinity<br />

OS<br />

hugetlbfs<br />

物 理 メモリを 直 接<br />

ユーザランドに<br />

mmapさせる<br />

NIC CPU memory<br />

カーネル 空 間<br />

13<br />

ユーザ 空 間


概 要<br />

~ 実 際 の 操 作 例 1~<br />

• 準 備 (<strong>DPDK</strong>はコンパイルしていること 前 提 )<br />

– hugepageをmount<br />

• Bootオプションを 以 下 のように 変 更<br />

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash<br />

default_hugepagesz=1G hugepagesz=1G hugepages=10<br />

norandmaps=0“<br />

• fstabに 以 下 のように 設 定<br />

nodev /mnt/huge hugetlbfs pagesize=1GB 0 0<br />

– おまじないを 唱 える<br />

$ sudo modprobe uio<br />

$ sudo insmod ./build/kmod/igb_uio.ko<br />

./dpdkにて<strong>DPDK</strong>を<br />

コンパイルしたと 想 定<br />

14


概 要<br />

~ 実 際 の 操 作 例 2~<br />

• サンプルアプリケーション(testpmd)の 実 行 まで<br />

– <strong>DPDK</strong>のuioドライバ 配 下 に、NICを 配 置<br />

• まずは、 現 状 確 認<br />

Network devices using <strong>DPDK</strong>-compatible driver<br />

============================================<br />

<br />

現 在 は、<br />

e1000eドライバ 配 下<br />

Network devices using kernel driver<br />

===================================<br />

0000:02:00.0 '82572EI Gigabit Ethernet Controller<br />

(Copper)' if=p4p1 drv=e1000e unused=<br />

0000:06:00.0 'RTL8111/8168/8411 PCI Express Gigabit<br />

Ethernet Controller' if=eth0 drv=r8169 unused= *Active*<br />

Other network devices<br />

=====================<br />

<br />

15


概 要<br />

~ 実 際 の 操 作 例 3~<br />

• サンプルアプリケーション(testpmd)の 実 行 まで<br />

– <strong>DPDK</strong>のuioドライバ 配 下 に、NICを 配 置<br />

• <strong>DPDK</strong>のuioドライバ(igb_uio)にbind<br />

$ sudo ./dpdk/<strong>to</strong>ols/dpdk_nic_bind.py -b igb_uio<br />

0000:02:00.0<br />

16


概 要<br />

~ 実 際 の 操 作 例 4~<br />

• サンプルアプリケーション(testpmd)の 実 行 まで<br />

現 在 は、<strong>DPDK</strong> 配 下<br />

– <strong>DPDK</strong>のuioドライバ 配 下 に、NICを 配 置<br />

• igb_uioにbindされているか 確 認<br />

Network devices using <strong>DPDK</strong>-compatible driver<br />

============================================<br />

0000:02:00.0 '82572EI Gigabit Ethernet Controller<br />

(Copper)' if=p4p1 drv=e1000e unused=<br />

Network devices using kernel driver<br />

===================================<br />

0000:06:00.0 'RTL8111/8168/8411 PCI Express Gigabit<br />

Ethernet Controller' if=eth0 drv=r8169 unused= *Active*<br />

Other network devices<br />

=====================<br />

<br />

17


概 要<br />

~ 実 際 の 操 作 例 5~<br />

• サンプルアプリケーション(testpmd)の 実 行 まで<br />

– testpmdを 実 行<br />

$ sudo ./dpdk/build/app/testpmd –c f –n 1 –vdev<br />

“eth_pcap0,iface=eth1” -- -i<br />

( 略 )<br />

testpmd><br />

– オプションの 意 味<br />

-c このアプリケーションを 動 作 させるコアマスク 指 定<br />

f は、Core0~Core3にて、<strong>DPDK</strong>のスレッドが 実 行 されることを 示 す。<br />

-n CPUソケットごとのメモリチャンネルの 数<br />

vdev<br />

仮 想 デバイスの 追 加 指 定 。この 場 合 、ibpcapでeth1にアクセスする 仮 想<br />

デバイスをアタッチしている。<br />

-- これ 以 前 は、<strong>DPDK</strong> 共 通 のオプション。これ 以 後 は、アプリケーション 固<br />

有 のオプション<br />

-i インタラクティブモードで 起 動<br />

あとは、startコマンドにて、<br />

0000:02:00.0とeth1 間 の<br />

双 方 向 データ 転 送 開 始<br />

testpmd<br />

02.0 eth1<br />

18


概 要<br />

~まとめ1~<br />

• uio/vfioを 使 ったユーザースペースデバイスドライバと<br />

ライブラリ<br />

– ( 主 に)<strong>Intel</strong>のNIC 対 象<br />

• ユーザ 空 間 から 独 自 のリソース 管 理<br />

– コア<br />

– メモリ<br />

• 独 自 のメモリ 管 理 の 仕 組 みを 構 築<br />

どうやって<br />

本 当 に 速 いの<br />

19


概 要<br />

~まとめ2~<br />

• uio / vfioを 使 っても 速 い 理 由<br />

– コアを 占 有 してポーリング 動 作<br />

• どうやって、 独 自 のリソース 管 理 をするか<br />

– コアを 占 有 するために、 既 存 のAffinity 用 のAPIを 利 用<br />

• コアを 占 有 なので、 管 理 といって 良 いかは 微 妙 だが・・・<br />

– hugetlbfsを 利 用 して、 物 理 メモリを 直 接 マッピング<br />

• hugepage(1Mや1G)なので、TLBミスも 大 幅 減<br />

– 獲 得 したメモリ 上 に、 独 自 のメモリ 管 理 機 構 を 構 築<br />

• 詳 細 は 後 述<br />

20


概 要<br />

~まとめ3~<br />

速 さの 秘 密 は、<br />

ポーリング<br />

キャッシュに 載 りやすい<br />

コンテキストスイッチなし<br />

ポーリング 動 作<br />

割 り 込 み 駆 動 の 必 要 なし<br />

効 率 よくポーリングさせる 仕 組 みを<br />

<strong>DPDK</strong>は 提 供<br />

• ロックしない<br />

• キャッシュミスを 減 らす<br />

実 は、アプリ 実 装 時 にも 意 識 する 必<br />

要 要 がある。<br />

21


詳 細<br />

~アプリの 作 り 方 ~ Run <strong>to</strong> completionモデル<br />

RX<br />

Port<br />

パケット 処 理 用 ポーリングスレッド<br />

(recv⇒sendを 繰 り 返 す)<br />

TX<br />

Port<br />

• 1スレッドが 受 信 から 送 信 まで 行 うモデル<br />

• 単 純 な 処 理 ならこれで 十 分<br />

• レイテンシも 抑 えられる。<br />

• なお、 各 ポートにアクセスできるのは1スレッドまで<br />

• 複 数 スレッドを 使 った 並 列 化 は 不 可 能<br />

• この 制 約 は、PMDの 仕 様 による。<br />

23


詳 細<br />

~アプリの 作 り 方 ~ Pipelineモデル<br />

RX<br />

Port<br />

受 信 専 用<br />

スレッド<br />

ロックレ<br />

スな<br />

キュー<br />

転<br />

スレッド<br />

送 専 用<br />

転 スレッド 送 専 用<br />

転 スレッド 送 専 用<br />

転 スレッド 送 専 用<br />

転 スレッド 送 専 用<br />

スレッド<br />

ロックレ<br />

スな<br />

キュー<br />

送 信 専 用<br />

スレッド<br />

TX<br />

Port<br />

• 幾 つかのスレッドをつなげてパケット 転 送 を 行 うモデル<br />

• “ 転 送 専 用 スレッド”で 複 雑 なパケット 操 作 を 行 う。<br />

• 当 然 、 各 スレッドごとにコアを1つ 占 有 する 。┐(´-`)┌<br />

• 複 雑 な 処 理 を 複 数 コアに 分 けて 並 列 度 をあげる。<br />

• 転 送 順 を 乱 してはいけない 場 合 は、 何 か 考 える 必 要 あり。<br />

• 複 雑 なアプリはだいたいこの 方 式 の 派 生 モデルで 実 装 ()<br />

• 事 前 に 処 理 能 力 を 想 定 しておく 必 要 あり。<br />

• 伝 統 的 な 組 込 みっぽい。<br />

24


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ ロックしない 仕 組 み1<br />

• Pipelineモデル 等 に 使 われるロックレスなキュー<br />

– もともとLinux/BSDで 使 用 されてきたキューの 軽 量 版<br />

• スレッドがコアを 占 有 することを 前 提 にさらに 高 速 化<br />

– <strong>DPDK</strong>では、”Ring”と 呼 ばれる。<br />

• 例 えば、バッファのアドレスをキューイングする。<br />

– Single/Multi Producer – Single/Multi Consumerに 対 応<br />

• キューに 対 して 複 数 スレッドから 同 時 にアクセス 可 能<br />

• ただし、Multi 環 境 では、 完 了 するまでロックしないがBusy waitする<br />

ことがある。<br />

Producer/Consumer 共<br />

Producer<br />

Consumer<br />

に、シングルでもマルチ<br />

Ring<br />

Producer<br />

Consumer スレッドでも 良 い!<br />

26


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ ロックしない 仕 組 み1 (contd.)<br />

• Ringを 使 用 する 際 の 制 約<br />

– multi producersにて、あるRingに 対 してenqueueするスレ<br />

ッドは、 同 一 のRingに 対 してmulti producersでenqueueす<br />

る 別 スレッドにpreemptされてはならない。<br />

– multi consumersにて、あるRingに 対 してdequeueするス<br />

レッドは、 同 一 のRingに 対 してmulti consumersで<br />

dequeueする 別 スレッドにpreemptされてはならない。<br />

– <strong>DPDK</strong>では、1スレッドでコアを 占 有 するため、Ringの 操 作<br />

中 にpreemptされることがない。<br />

27


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ ロックしない 仕 組 み2<br />

• ロックしない 仕 組 みではないが・・・<br />

– 各 PMD(デバイスドライバ)は、 同 一 ポートに 対 して 複 数 ス<br />

レッドがアクセスしてくることはないという 前 提 で 実 装<br />

– ポートにアクセス 可 能 なスレッドが 一 つの 理 由<br />

28


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ キャッシュの 活 用 (TLB)<br />

• TLBミスの 発 生 回 数 を 低 減 させる 仕 組 み<br />

– hugetlbfsを 利 用<br />

• <strong>DPDK</strong>から 物 理 メモリをmapするためにも 利 用<br />

• 2MBや1GBのpagesizeを 利 用<br />

• 黙 っていると、<strong>DPDK</strong>のアプリケーションは、 利 用 可 能 な 全 ての<br />

hugetlbfs 用 のメモリをmapしようとします。┐(´-`)┌<br />

– オプションで 使 用 メモリを 指 定 可 能<br />

29


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ キャッシュの 活 用 (Data)<br />

• <strong>DPDK</strong> 独 自 のメモリ 管 理<br />

– CPUキャッシュを 効 率 的 に 使 えるように、キャッシュのアラ<br />

イメント、DDR3やDIMMのチャンネル 数 、ランク 数 を 意 識 し<br />

てメモリを 割 り 当 てる 仕 組 み<br />

– ちなみに、NUMA 構 成 も 考 慮<br />

(<strong>DPDK</strong> Programers guideより)<br />

30


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ コア 単 位 のデータ 構 造<br />

• コア 別 のバッファ・リサイクルキューを 持 つ。<br />

– <strong>DPDK</strong>は、マルチプロセス・マルチスレッド 対 応<br />

– 複 数 のタスクから 共 有 されるデータは、hugetlbfs 上 に 構 築<br />

された 独 自 のメモリ 機 構 の 上 に 置 かれる。<br />

– ・・・が、なるべく、 一 つのデータにアクセスしたくない。<br />

– パケットバッファについては、 巧 妙 な 仕 組 みで 最 適 化


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ コア 単 位 のデータ 構 造 (contd.)<br />

• パケット 用 バッファには、 巧 妙 な 仕 掛 けがある。<br />

– このバッファは、もちろん、キャッシュラインを 考 慮 して 獲 得 されたもの。<br />

– バッファの 集 合 (mempool)を 用 意 し、mempoolの 使 用 状 況 をRingで 管 理<br />

– 複 数 スレッド(コア)からRingにアクセスし、ロックせずに 高 速 にバッファを<br />

取 得 解 放 可 能<br />

スレッド<br />

スレッド<br />

スレッド<br />

バッファ 解 放<br />

バッファ 獲 得<br />

バッファ 解 放<br />

Ring<br />

mempool<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

複 数 タスクからア<br />

クセスすると、<br />

RingはBusy wait<br />

することがあるん<br />

じゃ・・・<br />

この 図 は、 実 は 正 しくないです。 次 ページが 正 しい 図


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ コア 単 位 のデータ 構 造 (contd.)<br />

• 複 数 タスクが 同 一 Ringにアクセスする 場 合 、ロックはしないが、<br />

Busy waitすることがある。<br />

– このオーバーヘッドも 低 減 したい<br />

• スレッドごとに、バッファのリサイクルキュー( 実 際 は 配 列 ) 持 つ。<br />

• 使 い 終 わっても 直 ぐに 返 しにはいかない。<br />

• バッファ 獲 得 要 求 に 対 し、Ringに 返 さずに 取 っておいたバッファを 割 り 当 てる。<br />

スレッド<br />

リサイクルキュー<br />

未 使 用 バッファ<br />

バッファ 解 放<br />

mempool<br />

未 使 用 バッファ<br />

劇 的 な<br />

高 速 化 !<br />

スレッド<br />

スレッド<br />

リサイクルキュー<br />

未 使 用 バッファ<br />

リサイクルキュー<br />

未 使 用 バッファ<br />

バッファ 獲 得<br />

バッファ 解 放<br />

Ring<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

未 使 用 バッファ<br />

キャッシュするバッファ 数 は 設 定 可 能


詳 細<br />

~ 高 速 動 作 の 仕 組 み1~ SSEの 利 用<br />

• <strong>DPDK</strong>におけるSSE<br />

利 用 の 一 例<br />

• <strong>DPDK</strong>は、 独 自 の<br />

memcpy APIを 提 供<br />

– rte_memcpy<br />

• <strong>DPDK</strong>スレッド 上 で、<br />

<strong>DPDK</strong>のメモリ 機 構 上 の<br />

メモリをコピーする 速 度<br />

を 比 較<br />

バッファサイズ<br />

平 均<br />

rte_memcpy (sec/byte)<br />

平 均<br />

memcpy (sec/byte)<br />

8 2.50295E-10 4.58804E-10<br />

16 6.25674E-11 2.50263E-10<br />

24 4.1712E-11 1.66842E-10<br />

32 3.12835E-11 1.25132E-10<br />

40 4.19413E-11 1.00106E-10<br />

48 3.49382E-11 8.34208E-11<br />

56 2.99602E-11 7.74625E-11<br />

64 2.6234E-11 6.77814E-11<br />

128 3.02553E-11 3.65069E-11<br />

192 4.06138E-11 3.65201E-11<br />

256 3.44818E-11 2.99948E-11<br />

320 3.06291E-11 2.72697E-11<br />

384 2.66848E-11 2.44344E-11<br />

448 2.58069E-11 2.46057E-11<br />

512 2.41141E-11 2.34078E-11<br />

34


詳 細<br />

~ 高 速 動 作 の 仕 組 み2~ SSE 拡 張 の 利 用<br />

5E-10<br />

4.5E-10<br />

4E-10<br />

3.5E-10<br />

3E-10<br />

256byte 以 下 の 転 送<br />

が 劇 的 に 速 い<br />

2.5E-10<br />

2E-10<br />

rte_memcpy<br />

memcpy<br />

1.5E-10<br />

1E-10<br />

5E-11<br />

0<br />

0 500 1000 1500 2000 2500


詳 細<br />

~ 高 速 動 作 の 仕 組 み~ 高 速 化 手 法 のもたらす 制 約<br />

• 1スレッドで1コアを 占 有 する 制 約<br />

– Ringは、スレッドがコアを 占 有 していることが 前 提 の 実 装<br />

– 前 述 のように、Ringは<strong>DPDK</strong>の 根 幹 に 食 い 込 んでいるので、<br />

Ringを 使 えないのは 致 命 的<br />

• 同 一 ポートにアクセス 可 能 なのは、1スレッドという 制 約<br />

– PMDの 実 装 による 制 約


詳 細<br />

~PMDの 書 き 方 ~<br />

• Null PMD<br />

– /dev/nullライクなPMDを 書 いてみた。<br />

• 幾 らでもパケットを 受 信 できる。<br />

• 幾 らでもパケットを 送 信 できる。<br />

– 仮 想 デバイスに 対 するPMD<br />

– http://dpdk.org/dev/patchwork/patch/686/<br />

– 非 常 に 単 純 な 構 造 なので、ひな 型 になるはず。<br />

– <strong>Intel</strong> 以 外 のNICでも、PMDを 書 けば、<strong>DPDK</strong>は 動 作 するの<br />

で、 興 味 がある 人 は 書 いてみてください。<br />

38


詳 細<br />

~ 限 界 性 能 測 定 1~<br />

• Null PMDを 利 用 して、<strong>DPDK</strong>の 限 界 性 能 を 簡 易 測 定<br />

– testpmdは、2つのポート 間 の 単 純 な 転 送 を 繰 り 返 す。<br />

– 2つのスレッドを 持 つ<br />

• port0⇒port1の 転 送 を 行 うスレッド<br />

• port1⇒port0への 転 送 を 行 うスレッド<br />

– Null PMDは、( 非 常 に 小 さいコストで)いくらでもパケットを 送 受 信 でき<br />

るので、 限 界 性 能 が 簡 易 測 定 できる。<br />

– 転 送 時 に1コピー<br />

• 本 当 はゼロコピー 環 境 が 転 送 の 限 界 性 能 に 近 いはずだが、 今 回 は 測 定 時<br />

間 がなかったので、 以 前 に 測 定 した1コピー 転 送 の 結 果<br />

testpmd<br />

port0<br />

Null PMD<br />

port1<br />

Null PMD<br />

40


詳 細<br />

~ 限 界 性 能 測 定 2~<br />

測 定 環 境<br />

CPU<br />

hugetlbfs 割 当<br />

<strong>Intel</strong>(R) Xeon(R) CPU E5-2697 <strong>v2</strong> @ 2.70GHz<br />

40GB (pagesize=1GB)<br />

測 定 結 果 ~コアあたりの 転 送 性 能 ~ (かなり、ざっくり)<br />

64byte 52Mpps / 26Gbps<br />

1500byte 16.72Mpps / 195.05Gbps<br />

1コピーでこの 速 度 なら、ゼロコピーで160Mppsに 届 くのかも<br />

もしくは、 複 数 コア/ポートを 使 って、160Mfpsという 意 味 なのかも<br />

1コピーでこの 性 能 なため、 複 雑 なパケット 処 理 を 行 うと、この 値 以<br />

下 になりそう。<br />

41


ホスト-VM 間 通 信<br />

• ホスト 上 の<strong>DPDK</strong>アプリと、VM 上 の<strong>DPDK</strong>アプリが 高<br />

速 に 通 信 する 仕 組 みについて<br />

– なぜ、 必 要 なのか<br />

• ネットワーク 業 界 でよく 言 われる、SDN-NFVという 構 成 を 実 現 する<br />

際 に 必 要 になる。<br />

– SDN-NFVとは<br />

• ホスト 上 では、OpenFlowに 対 応 したソフトウェアスイッチ(SSW)を<br />

動 作 させ、 実 際 のパケット 処 理 はVMで 行 うという 構 成<br />

– LinuxとQEMU 環 境 の 場 合 について 説 明<br />

43


ホスト-VM 間 通 信<br />

~e1000 & pcap 経 由 ~<br />

user space on host<br />

Guest<br />

<strong>DPDK</strong> App2<br />

user space on VM<br />

<strong>DPDK</strong> App1<br />

e1000 PMD<br />

uio<br />

kernel space on VM<br />

pcap PMD<br />

e1000<br />

tap client<br />

QEMU<br />

tap driver<br />

kernel space on host<br />

44


ホスト-VM 間 通 信<br />

~e1000 & pcap 経 由 ~ App1からの 送 信<br />

QEMU<br />

tap client<br />

User<br />

<strong>DPDK</strong> App1<br />

pcap PMD<br />

コピー<br />

Kernel<br />

コピー<br />

tap driver<br />

※ 注 意<br />

黒 線 をまたぐと<br />

コンテキストスイッチ 発 生<br />

Host<br />

Guest<br />

e1000<br />

コピー<br />

割 り 込 み<br />

コピー<br />

パケット<br />

バッファ<br />

レジスタ<br />

アクセス<br />

レジスタ<br />

アクセス<br />

KVM<br />

割 り 込 み<br />

<strong>DPDK</strong> App2<br />

e1000 PMD<br />

割 り 込 み<br />

uio<br />

参 考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf


ホスト-VM 間 通 信<br />

~virtio-net & pcap 経 由 ~<br />

user space on host<br />

Guest<br />

<strong>DPDK</strong> App2<br />

user space on VM<br />

<strong>DPDK</strong> App1<br />

virtio-net PMD<br />

uio<br />

kernel space on VM<br />

pcap PMD<br />

virtio-net<br />

tap client<br />

QEMU<br />

tap driver<br />

kernel space on host<br />

46


ホスト-VM 間 通 信<br />

~virtio-net & pcap 経 由 ~ App1からの 送 信<br />

QEMU<br />

tap client<br />

User<br />

<strong>DPDK</strong> App1<br />

pcap PMD<br />

コピー<br />

Kernel<br />

コピー<br />

tap driver<br />

※ 注 意<br />

黒 線 をまたぐと<br />

コンテキストスイッチ 発 生<br />

Host<br />

virtio-net<br />

コピー<br />

割 り 込 み<br />

KVM<br />

Guest<br />

コピー<br />

パケット<br />

バッファ<br />

割 り 込 み<br />

実 デバイスをシミュ<br />

レートしていない<br />

virtio-netは、そもそ<br />

も、 送 受 信 に 際 して<br />

レジスタアクセスを<br />

発 生 させない。<br />

<strong>DPDK</strong> App2<br />

virtio-net PMD<br />

割 り 込 み<br />

uio<br />

参 考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf


ホスト-VM 間 通 信<br />

~virtio-net & vhost & pcap 経 由 ~<br />

user space on host<br />

Guest<br />

<strong>DPDK</strong> App2<br />

user space on VM<br />

<strong>DPDK</strong> App1<br />

virtio PMD<br />

uio<br />

kernel space on VM<br />

pcap PMD<br />

tap driver<br />

kernel space on host<br />

virtio-net<br />

vhost-net<br />

tap client<br />

QEMU<br />

vhost-netは、ホス<br />

トのカーネル 内 で、<br />

virtio-netのパケット<br />

送 受 信 処 理 を 行 う<br />

仕 組 み。<br />

よって、 送 受 信 の<br />

際 にvirtio-netは 関<br />

わらなくなる。<br />

48


ホスト-VM 間 通 信<br />

~virtio-net & vhost & pcap 経 由 ~ App1からの 送 信<br />

QEMU<br />

User<br />

<strong>DPDK</strong> App1<br />

pcap PMD<br />

Kernel<br />

コピー<br />

tap driver<br />

コピー<br />

※ 注 意<br />

黒 線 をまたぐと<br />

コンテキストスイッチ 発 生<br />

tap client<br />

Host<br />

vhost-net<br />

割 り 込 み<br />

KVM<br />

Guest<br />

コピー<br />

パケット<br />

バッファ<br />

割 り 込 み<br />

<strong>DPDK</strong> App2<br />

virtio-net PMD<br />

割 り 込 み<br />

uio<br />

参 考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf


ホスト-VM 間 通 信<br />

~virtio-net & cuse & vhost backend 経 由 ~<br />

user space on host<br />

<strong>DPDK</strong> App1<br />

vhost<br />

backend<br />

eventfd<br />

kernel module<br />

kernel space on host<br />

<strong>DPDK</strong> App2<br />

virtio PMD<br />

uio<br />

virtio-net<br />

CUSE<br />

Guest<br />

user space on VM<br />

CUSEを 使 って、vhost-netの<br />

実 装 を<strong>DPDK</strong> App1の 中 で 行 っ<br />

てしまう!<br />

この 場 合 、<strong>DPDK</strong> App1からゲ<br />

kernel ストの space 物 on 理 メモリにアクセスで<br />

VM<br />

きる 必 要 がある(ゲストの 物 理<br />

メモリをhugetlbfs 上 から 取 得 す<br />

QEMU<br />

る 必 要 がある。 読 み 書 きの 権<br />

限 も 必 要 )<br />

また、 通 知 のために、<strong>DPDK</strong>の<br />

提 供 する 特 別 なカーネルモ<br />

ジュールが 必 要<br />

<strong>Intel</strong> 考 案 !<br />

50


ホスト-VM 間 通 信<br />

~virtio-net & cuse & vhost backend 経 由 ~ App1からの 送 信<br />

User<br />

Kernel<br />

※ 注 意<br />

黒 線 をまたぐと<br />

コンテキストスイッチ 発 生<br />

Host<br />

QEMU<br />

<strong>DPDK</strong> App1<br />

vhost<br />

backend<br />

コピー<br />

割 り 込 み<br />

event 通 知<br />

kernel<br />

module<br />

割 り 込 み<br />

KVM<br />

Guest<br />

パケット<br />

バッファ<br />

割 り 込 み<br />

App1とApp2が 共<br />

にポーリングしてい<br />

るので、 通 知 は 必<br />

要 なし!<br />

<strong>DPDK</strong> App2<br />

virtio-net PMD<br />

割 り 込 み<br />

uio<br />

参 考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf


ホスト-VM 間 通 信<br />

~virtio-net & vhost-user backend 経 由 ~<br />

user space on host<br />

<strong>DPDK</strong> App1<br />

vhostuser<br />

backend<br />

<strong>DPDK</strong> App2<br />

virtio PMD<br />

virtio-net<br />

eventfd<br />

Guest<br />

user space on VM<br />

QEMU-2.1 以 上 では、vhost-net<br />

のバックエンドを、ユーザ 空 間 にイ<br />

ンプリさせるための 仕 組 みが 実 装<br />

されている(vhost-user)。<br />

kernel space on VM<br />

よって、CUSEを 使 う 必 要 はなくな<br />

る。<br />

QEMU<br />

なお、この 仕 組 みでも、ゲストの 物<br />

理 メモリは、hugetlbfsから 取 得 す<br />

る 必 要 がある。<br />

なお、イベント 通 知 には、 通 常 の<br />

eventfdを 使 用 する( 特 別 なカーネ<br />

ルモジュールは 必 要 ない)。<br />

kernel space on host<br />

52


ホスト-VM 間 通 信<br />

~virtio-net & vhost-user backend 経 由 ~ App1からの 送 信<br />

User<br />

Kernel<br />

※ 注 意<br />

黒 線 をまたぐと<br />

コンテキストスイッチ 発 生<br />

QEMU<br />

<strong>DPDK</strong> App1<br />

Host<br />

vhost -user<br />

backend<br />

コピー<br />

割 り 込 み<br />

eventfd<br />

割 り 込 み<br />

KVM<br />

Guest<br />

パケット<br />

バッファ<br />

割 り 込 み<br />

App1とApp2が 共<br />

にポーリングしてい<br />

るので、 通 知 は 必<br />

要 なし!<br />

<strong>DPDK</strong> App2<br />

virtio-net PMD<br />

割 り 込 み<br />

uio<br />

参 考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf


ホスト-VM 間 通 信<br />

~その 他 ~<br />

• 他 にも、いろいろありますが、ここでは 割 愛<br />

– IVSHMEM + Ring<br />

– MEMNIC PMD<br />

• NEC 製<br />

– 高 速 な 転 送 を 実 現 するものは、 何 らかの 共 有 メモリを 実 現<br />

して、そのうえでパケット 交 換 するものです。<br />

54


<strong>DPDK</strong>アプリ 例<br />

~open sourceのみ~<br />

アプリ 名<br />

ライセンス 概 要<br />

lagopus BSD OpenFlow-1.3 対 応 のソフトウェアスイッチ<br />

dpdk-ovs BSD <strong>DPDK</strong> 対 応 したOpen vSwitch<br />

Packetgen BSD パケットジェネレータ<br />

dpdk-rumptcpip BSD<br />

ipaugenblick<br />

rumpkernelの<strong>DPDK</strong> 対 応<br />

GPL/BSD Linux TCP/IPスタックの<strong>DPDK</strong>ポーティング<br />

dpdk-odp BSD BSDのTCP/IPスタックを<strong>DPDK</strong>にポーティング<br />

(ソースコードをいつまでも 公 開 しないので、 使<br />

わない 方 が 無 難 )<br />

56


まとめ<br />

• 既 存 のフレームワークでは、 高 速 転 送 を 実 現 できない<br />

• <strong>DPDK</strong>は、ユーザランドから、CPU・メモリ・NICを 扱 う 仕 組 み<br />

– NICは、uio/vfio 経 由<br />

– CPUは、Affinity 管 理<br />

– メモリは、hugetlbfs 経 由<br />

• ポーリングを 効 率 的 に 行 うことで 高 速 化 を 達 成<br />

• 実 際 に、<strong>DPDK</strong>を 使 用 したアプリや 製 品 が 出 始 めている。<br />

• <strong>DPDK</strong>のコミュニティ<br />

– Site: http://dpdk.org/<br />

– ML: dev@dpdk.org<br />

57

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!