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