スライド 1

Similar documents
160311_icm2015-muramatsu-v2.pptx

スライド 1

Lagopus SDN/OpenFlow switch: yet another SDN/OF switch agent and high-performance software switch

[公開OK][空閑さん資料]kuga-ovs-fpga.pptx

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

TFTP serverの実装

netmapによる 実践パケット処理プログラミング

bitvisor_summit.pptx

Monthly Research / セキュアハードウェアの登場とその分析

スライド 1

Microsoft Word - Dolphin Expressによる10Gbpソケット通信.docx

Microsoft Word - nvsi_050110jp_netvault_vtl_on_dothill_sannetII.doc

PowerPoint プレゼンテーション

BitVisor Updates in 2016

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Pervasive PSQL v11 のベンチマーク パフォーマンスの結果

目次 背景 IEEE802.3azとは Linuxカーネルの対応状況 測定方法 測定結果 まとめ 1

PowerPoint プレゼンテーション

第一章 LPC2478 ボードの概要...3 第二章 uclinux の初体験 SD カードのテスト USB メモリのテスト USB Devices のテスト network のテスト...6 第三章 uclinux のコンパイル...

Software-Defined Tester(SDT) を用いた高精度遅延測定による SDN/NFV 品質向上 富士通アドバンストテクノロジ株式会社システム技術統括部大久保克彦 0 Copyright 2017 FUJITSU AD

PRIMERGY TX100 S3 未サポートOS動作検証確認情報

ERDAS IMAGINE における処理速度の向上 株式会社ベストシステムズ PASCO CORPORATION 2015

(Microsoft PowerPoint - E6x5C SDXC Demo Seminar [\214\335\212\267\203\202\201[\203h])

PRIMERGY TX100 S3 未サポートOS動作検証確認情報

Evalution of Linux Container(LXC) on Embedded Linux 株式会社富士通コンピュータテクノロジーズ町田裕樹 1201ka01 Copyright 2013 FUJITSU COMPUTER TECHLONOGIES LIMITED

PRIMERGY TX1310 M1 未サポートOS動作検証確認情報

Microsoft PowerPoint - OS07.pptx

Congress Deep Dive

X-MON 3.1.0

PowerPoint プレゼンテーション

HP Z200 Intel i5 CPU 3.33GHz Low Profile 仕様 380 LP Assist 2.2 Instinct v3.0 以降 いいえいいえはいいいえ 4GB および 8GB DDR ECC (2 枚構成の DIMM) ISIS へ接続するにはオンボードの

スライド 1

PowerPoint-Präsentation

PRIMERGY TX140 S1 未サポートOS動作検証確認情報

Microsoft Word - appendix_b_srft.doc

Sylpheed とは オープンソースのメールソフト ライセンスは GPL+LGPL 高速 軽量 高機能 高い操作性 高い信頼性 導入が容易 マルチプラットフォーム Windows, Linux, etc. 多言語対応 ( 約 30 ヶ国語 )

template.dvi

Microsoft PowerPoint - JANOG19-u10-GigaPcap(NonAnim).ppt

Microsoft PowerPoint - Android+TPMによるセキュアブート_KDDI研_後日配布用

ご使用上の注意

作って覚えるDPDKプログラミング

Express5800 シリーズ Windows Server 2019 NIC チーミング (LBFO) 設定手順書 Microsoft Windows Windows Server は 米国 Microsoft Corporation の米国およびその他の国における登録商標です その他 記載され

仮想マシンの高速ライブマイグレーション技術 Yabusame: Postcopy Live Migration for Qemu/KVM

memcached 方式 (No Replication) 認証情報は ログインした tomcat と設定された各 memcached サーバーに認証情報を分割し振り分けて保管する memcached の方系がダウンした場合は ログインしたことのあるサーバーへのアクセスでは tomcat に認証情報

1 Atollic TrueSTUDIO( GR-PEACH TOPPERS/ASP ASP GR-PEACH mbed ( git

PRIMERGY RX200 S8/RX350 S7とETERNUS LT40でのAcronis Backup & Recovery 11.5 Advanced Serverによるイメージバックアップ動作検証

Microsoft Word - RefApp7インストールガイド.doc

Microsoft Word - nvsi_080177jp_trendmicro_bakbone.doc

セキュアVMの アーキテクチャ概要

TRQerS - Introduction

BMR for NVBU NIC bnx2.ko SVR/CLNT 上での SCSI megaraid_sas.ko 自動認識デバイス Partition 構成 (RHEL6.0 uefi/lvm 構成の場合 ) Partition1 /boot/efi EFI 200MB Partition2 /

システムソリューションのご紹介

ポート拡張オプション(10GBASE-T×2)

スライド 1

NTMobile LAN NT- Mobile(Network Traversal with Mobility) [1] NTMobile LAN 2. NTMobile NTMobile NTMobile NTM IP DC(Direction Coordinator)

NEC 製PC サーバ『Express5800 R120f-1E』とSanDisk『ioMemory SX /SX 』検証報告書

CommCheckerManual_Ver.1.0_.doc

超勉強会2012 MeeGoの変遷

提案書

Transcription:

Introduction to Intel DPDK Oct 24 th, 2014 IGEL Co.,Ltd. Tetsuya Mukawa 武川哲也

はじめに Q: Intel DPDK( 以下 DPDK) って? A: 高スループット / 低レイテンシのネットワークを実現する仕組みです Q: DPDK の目的は? A: 高価な NW 機器と同等の機能 性能を Linux/BSD 上のソフトウェアで実現することです Q: DPDK は サーバ用途の技術では? A: 今のところ その通りです Q: なぜ CELF で? A: 高速化手法が面白いので紹介します Q: あなたは誰? A: 組込みエンジニアです たまに CELF に参加しています 2

3

DPDK の衝撃 1 ~ 高速転送 ~ 公称 Over 160Mpps(fps) 64byte( ショート ) パケットで 約 80Gbps 1024byte パケットで 約 1300Gbps 通信事業にとっては ショートパケットのパフォーマンスが重要らしい ( 聞いた話 ) 現在手に入る NIC の最速は 40Gbps(?) というわけで 160Mpps は 信じられないくらい速い 信じられないので 調べてみました ( 後述 ) 4

DPDK の衝撃 2 ~ 安価 ~ BSDライセンス Linux/BSD 上で動作 x86だけでなく ARMやPower 上でも動作 ATOM も 専用機器に比べて非常に安価なサーバ上で 専用機器と同等の性能 機能を持つネットワーク機器を作成することが可能に ネットワーク業界に大きなインパクト 5

6

DPDK の生まれた背景 ~ 想像です ~ 通信事業者 最近では Linaro IBM ARM ポーティングは Linaro 主導 https://wiki.linaro.org/lng/engineering/dpdk NW 専用機器は高すぎる Intel 自社の CPU や NIC を売りたい ソフトウェア会社 寡占だった NW 専用機器にビジネスチャンス DPDK 初期では 6WIND Wind River Power ポーティングは IBM 主導 7

DPDK の歴史 年月バーション拡張された機能 2012 年 11 月 DPDK-1.2.3 2013 年 6 月 DPDK-1.3.1 2013 年 8 月 DPDK-1.4.1 2013 年 9 月 DPDK-1.5.0 2013 年 10 月 DPDK-1.5.1 2014 年 1 月 DPDK-1.6.0 2014 年 6 月 DPDK-1.7.0 2014 年 11 月? DPDK-1.8.0 VM との通信拡張 数種の仮想デバイスサポート 機能の詳細については後述 アプリ制作に便利なライブラリの追加 比較的 新しいソフトウェア 最近になって アプリ用のライブラリが充実してきている 8

コミュニティ DPDK-1.4? DPDK-1.6 Intel の対応 6WIND の対応 利用者の反応 Intel の対応 Intel の公式サイトにて ソースコードのみ公開 git は非公開 dpdk.org を立ち上げ 独自に ML と git を提供 Intel のソースから作成した git tree dpdk.org に patch を投稿 Intel の DPDK-1.5 より dpdk.org の DPDK-1.5 の方が高機能に dpdk.org を公式な git と認定 Intel 自身も dpdk.org に投稿 メンテナは Intel ではなく 6WIND コミュニティでは Intel と共に 6WIND にも存在感 9

10

概要 ~ 既存フレームワークによる転送の限界 ~ 例えば Linux では 1Mpps 以下 1500byte 程度のパケットでも 実測 10Gbps を下回るらしい 既存デバドラによる転送はなぜ遅いか? 割り込みによるオーバーヘッド コンテキストスイッチのオーバーヘッド TLBミス (CPU Coreの ) キャッシュミス 11

概要 ~DPDK のアーキテクチャ ( 超基本 )~ uio/vfio を使ったユーザースペースデバイスドライバとライブラリ ( 主に )Intel の NIC 対象 ユーザ空間から独自のリソース管理 コア メモリ 独自のメモリ管理の仕組みを構築 サーバ対象のソフトウェアなのに uio/vfio と組込みみたい 12

概要 ~ ブロック図 ~ DPDK Application DPDK EAL ポーリングで動作するアプリケーション ポーリング動作するデバイスドライバ (PMD) コアを占有 コンテキストスイッチさせない = ポーリング etc... ポート管理 user level device driver コア管理 バッファ管理キュー管理メモリ管理 キャッシュラインまで意識したバッファの管理 ロックレスなキュー 独自のメモリ管理機構を構築 uio / vfio CPU affinity OS hugetlbfs 物理メモリを直接ユーザランドに mmap させる NIC CPU memory カーネル空間 13 ユーザ空間

概要 ~ 実際の操作例 1~ 準備 (DPDK はコンパイルしていること前提 ) hugepage を mount Boot オプションを以下のように変更 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash default_hugepagesz=1g hugepagesz=1g hugepages=10 norandmaps=0 fstab に以下のように設定 nodev /mnt/huge hugetlbfs pagesize=1gb 0 0 おまじないを唱える $ sudo modprobe uio $ sudo insmod./build/kmod/igb_uio.ko./dpdk にて DPDK をコンパイルしたと想定 14

概要 ~ 実際の操作例 2~ サンプルアプリケーション (testpmd) の実行まで DPDK の uio ドライバ配下に NIC を配置 まずは 現状確認 Network devices using DPDK-compatible driver ============================================ <none> 現在は e1000e ドライバ配下 Network devices using kernel driver =================================== 0000:02:00.0 '82572EI Gigabit Ethernet Controller (Copper)' if=p4p1 drv=e1000e unused= 0000:06:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller' if=eth0 drv=r8169 unused= *Active* Other network devices ===================== <none> 15

概要 ~ 実際の操作例 3~ サンプルアプリケーション (testpmd) の実行まで DPDK の uio ドライバ配下に NIC を配置 DPDK の uio ドライバ (igb_uio) に bind $ sudo./dpdk/tools/dpdk_nic_bind.py -b igb_uio 0000:02:00.0 16

概要 ~ 実際の操作例 4~ サンプルアプリケーション (testpmd) の実行まで 現在は DPDK 配下 DPDK の uio ドライバ配下に NIC を配置 igb_uio に bind されているか確認 Network devices using DPDK-compatible driver ============================================ 0000:02:00.0 '82572EI Gigabit Ethernet Controller (Copper)' if=p4p1 drv=e1000e unused= Network devices using kernel driver =================================== 0000:06:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller' if=eth0 drv=r8169 unused= *Active* Other network devices ===================== <none> 17

概要 ~ 実際の操作例 5~ サンプルアプリケーション (testpmd) の実行まで testpmd を実行 $ sudo./dpdk/build/app/testpmd c f n 1 vdev eth_pcap0,iface=eth1 -- -i ( 略 ) testpmd> オプションの意味 -c このアプリケーションを動作させるコアマスク指定 f は Core0~Core3 にて DPDK のスレッドが実行されることを示す -n CPU ソケットごとのメモリチャンネルの数 vdev 仮想デバイスの追加指定 この場合 ibpcap で eth1 にアクセスする仮想デバイスをアタッチしている -- これ以前は DPDK 共通のオプション これ以後は アプリケーション固有のオプション -i インタラクティブモードで起動 あとは start コマンドにて 0000:02:00.0 と eth1 間の双方向データ転送開始 testpmd 02.0 eth1 18

概要 ~ まとめ 1~ uio/vfioを使ったユーザースペースデバイスドライバとライブラリ ( 主に )Intel の NIC 対象 ユーザ空間から独自のリソース管理 コア メモリ 独自のメモリ管理の仕組みを構築 どうやって? 本当に速いの? 19

概要 ~ まとめ 2~ uio / vfio を使っても速い理由 コアを占有してポーリング動作 どうやって 独自のリソース管理をするか コアを占有するために 既存の Affinity 用の API を利用 コアを占有なので 管理といって良いかは微妙だが hugetlbfs を利用して 物理メモリを直接マッピング hugepage(1m や 1G) なので TLB ミスも大幅減 獲得したメモリ上に 独自のメモリ管理機構を構築 詳細は後述 20

概要 ~ まとめ 3~ 速さの秘密は ポーリング キャッシュに載りやすい コンテキストスイッチなし ポーリング動作 割り込み駆動の必要なし 効率よくポーリングさせる仕組みを DPDK は提供 ロックしない キャッシュミスを減らす 実は アプリ実装時にも意識する必要要がある 21

22

詳細 ~ アプリの作り方 ~ Run to completion モデル RX Port パケット処理用ポーリングスレッド (recv send を繰り返す ) TX Port 1 スレッドが受信から送信まで行うモデル 単純な処理ならこれで十分 レイテンシも抑えられる なお 各ポートにアクセスできるのは 1 スレッドまで 複数スレッドを使った並列化は不可能 この制約は PMD の仕様による 23

詳細 ~ アプリの作り方 ~ Pipeline モデル RX Port 受信専用スレッド ロックレスなキュー 転送専用転送専用転送専用スレッドスレッド転送専用スレッド転送専用スレッド転送専用スレッドスレッド ロックレスなキュー 送信専用スレッド TX Port 幾つかのスレッドをつなげてパケット転送を行うモデル 転送専用スレッド で複雑なパケット操作を行う 当然 各スレッドごとにコアを1つ占有する ( -`) 複雑な処理を複数コアに分けて並列度をあげる 転送順を乱してはいけない場合は 何か考える必要あり 複雑なアプリはだいたいこの方式の派生モデルで実装 (?) 事前に処理能力を想定しておく必要あり 24 伝統的な組込みっぽい

25

詳細 ~ 高速動作の仕組み ~ ロックしない仕組み 1 Pipeline モデル等に使われるロックレスなキュー もともと Linux/BSD で使用されてきたキューの軽量版 スレッドがコアを占有することを前提にさらに高速化 DPDK では Ring と呼ばれる 例えば バッファのアドレスをキューイングする Single/Multi Producer Single/Multi Consumer に対応 キューに対して複数スレッドから同時にアクセス可能 ただし Multi 環境では 完了するまでロックしないがBusy waitすることがある Producer/Consumer 共 Producer Consumer に シングルでもマルチ Ring Producer Consumer スレッドでも良い! 26

詳細 ~ 高速動作の仕組み ~ ロックしない仕組み 1 (contd.) Ring を使用する際の制約 multi producers にて ある Ring に対して enqueue するスレッドは 同一の Ring に対して multi producers で enqueue する別スレッドに preempt されてはならない multi consumers にて ある Ring に対して dequeue するスレッドは 同一の Ring に対して multi consumers で dequeue する別スレッドに preempt されてはならない DPDK では 1 スレッドでコアを占有するため Ring の操作中に preempt されることがない 27

詳細 ~ 高速動作の仕組み ~ ロックしない仕組み 2 ロックしない仕組みではないが 各 PMD( デバイスドライバ ) は 同一ポートに対して複数スレッドがアクセスしてくることはないという前提で実装 ポートにアクセス可能なスレッドが一つの理由 28

詳細 ~ 高速動作の仕組み ~ キャッシュの活用 (TLB) TLB ミスの発生回数を低減させる仕組み hugetlbfs を利用 DPDK から物理メモリを map するためにも利用 2MB や 1GB の pagesize を利用 黙っていると DPDK のアプリケーションは 利用可能な全ての hugetlbfs 用のメモリを map しようとします ( -`) オプションで使用メモリを指定可能 29

詳細 ~ 高速動作の仕組み ~ キャッシュの活用 (Data) DPDK 独自のメモリ管理 CPU キャッシュを効率的に使えるように キャッシュのアライメント DDR3 や DIMM のチャンネル数 ランク数を意識してメモリを割り当てる仕組み ちなみに NUMA 構成も考慮 (DPDK Programers guide より ) 30

詳細 ~ 高速動作の仕組み ~ コア単位のデータ構造 コア別のバッファ リサイクルキューを持つ DPDK は マルチプロセス マルチスレッド対応 複数のタスクから共有されるデータは hugetlbfs 上に構築された独自のメモリ機構の上に置かれる が なるべく 一つのデータにアクセスしたくない パケットバッファについては 巧妙な仕組みで最適化

詳細 ~ 高速動作の仕組み ~ コア単位のデータ構造 (contd.) パケット用バッファには 巧妙な仕掛けがある このバッファは もちろん キャッシュラインを考慮して獲得されたもの バッファの集合 (mempool) を用意し mempool の使用状況を Ring で管理 複数スレッド ( コア ) から Ring にアクセスし ロックせずに高速にバッファを取得解放可能 スレッド スレッド スレッド バッファ解放 バッファ獲得 バッファ解放 Ring mempool 未使用バッファ 未使用バッファ 未使用バッファ未使用バッファ未使用バッファ 未使用バッファ 複数タスクからアクセスすると Ring は Busy wait することがあるんじゃ??? この図は 実は正しくないです 次ページが正しい図

詳細 ~ 高速動作の仕組み ~ コア単位のデータ構造 (contd.) 複数タスクが同一 Ring にアクセスする場合 ロックはしないが Busy wait することがある このオーバーヘッドも低減したい スレッドごとに バッファのリサイクルキュー ( 実際は配列 ) 持つ 使い終わっても直ぐに返しにはいかない バッファ獲得要求に対し Ring に返さずに取っておいたバッファを割り当てる スレッド リサイクルキュー未使用バッファ バッファ解放 mempool 未使用バッファ 劇的な高速化! スレッド スレッド リサイクルキュー未使用バッファ リサイクルキュー未使用バッファ バッファ獲得 バッファ解放 Ring 未使用バッファ 未使用バッファ未使用バッファ未使用バッファ 未使用バッファ キャッシュするバッファ数は設定可能

詳細 ~ 高速動作の仕組み 1~ SSE の利用 DPDK における SSE 利用の一例 DPDK は 独自の memcpy API を提供 rte_memcpy DPDK スレッド上で DPDK のメモリ機構上のメモリをコピーする速度を比較 バッファサイズ 平均 rte_memcpy (sec/byte) 平均 memcpy (sec/byte) 8 2.50295E-10 4.58804E-10 16 6.25674E-11 2.50263E-10 24 4.1712E-11 1.66842E-10 32 3.12835E-11 1.25132E-10 40 4.19413E-11 1.00106E-10 48 3.49382E-11 8.34208E-11 56 2.99602E-11 7.74625E-11 64 2.6234E-11 6.77814E-11 128 3.02553E-11 3.65069E-11 192 4.06138E-11 3.65201E-11 256 3.44818E-11 2.99948E-11 320 3.06291E-11 2.72697E-11 384 2.66848E-11 2.44344E-11 448 2.58069E-11 2.46057E-11 512 2.41141E-11 2.34078E-11 34

詳細 ~ 高速動作の仕組み 2~ SSE 拡張の利用 5E-10 4.5E-10 4E-10 3.5E-10 3E-10 256byte 以下の転送が劇的に速い 2.5E-10 2E-10 rte_memcpy memcpy 1.5E-10 1E-10 5E-11 0 0 500 1000 1500 2000 2500

詳細 ~ 高速動作の仕組み ~ 高速化手法のもたらす制約 1 スレッドで 1 コアを占有する制約 Ring は スレッドがコアを占有していることが前提の実装 前述のように Ring は DPDK の根幹に食い込んでいるので Ring を使えないのは致命的 同一ポートにアクセス可能なのは 1 スレッドという制約 PMD の実装による制約

37

詳細 ~PMD の書き方 ~ Null PMD /dev/null ライクな PMD を書いてみた 幾らでもパケットを受信できる 幾らでもパケットを送信できる 仮想デバイスに対する PMD http://dpdk.org/dev/patchwork/patch/686/ 非常に単純な構造なので ひな型になるはず Intel 以外の NIC でも PMD を書けば DPDK は動作するので 興味がある人は書いてみてください 38

39

詳細 ~ 限界性能測定 1~ Null PMD を利用して DPDK の限界性能を簡易測定 testpmd は 2 つのポート間の単純な転送を繰り返す 2 つのスレッドを持つ port0 port1 の転送を行うスレッド port1 port0 への転送を行うスレッド Null PMD は ( 非常に小さいコストで ) いくらでもパケットを送受信できるので 限界性能が簡易測定できる 転送時に 1 コピー 本当はゼロコピー環境が転送の限界性能に近いはずだが 今回は測定時間がなかったので 以前に測定した 1 コピー転送の結果 testpmd port0 Null PMD port1 Null PMD 40

詳細 ~ 限界性能測定 2~ 測定環境 CPU hugetlbfs 割当 Intel(R) Xeon(R) CPU E5-2697 v2 @ 2.70GHz 40GB (pagesize=1gb) 測定結果 ~コアあたりの転送性能 ~ ( かなり ざっくり ) 64byte 52Mpps / 26Gbps 1500byte 16.72Mpps / 195.05Gbps 1 コピーでこの速度なら ゼロコピーで 160Mpps に届くのかも? もしくは 複数コア / ポートを使って 160Mfps という意味なのかも? 1 コピーでこの性能なため 複雑なパケット処理を行うと この値以下になりそう 41

42

ホスト -VM 間通信 ホスト上の DPDK アプリと VM 上の DPDK アプリが高速に通信する仕組みについて なぜ 必要なのか? ネットワーク業界でよく言われる SDN-NFV という構成を実現する際に必要になる SDN-NFV とは? ホスト上では OpenFlow に対応したソフトウェアスイッチ (SSW) を動作させ 実際のパケット処理は VM で行うという構成 Linux と QEMU 環境の場合について説明 43

ホスト -VM 間通信 ~e1000 & pcap 経由 ~ user space on host Guest DPDK App2 user space on VM DPDK App1 e1000 PMD uio kernel space on VM pcap PMD e1000 tap client QEMU tap driver kernel space on host 44

ホスト -VM 間通信 ~e1000 & pcap 経由 ~ App1 からの送信 QEMU tap client User DPDK App1 pcap PMD コピー Kernel コピー tap driver 注意黒線をまたぐとコンテキストスイッチ発生 Host Guest e1000 コピー 割り込み コピー パケットバッファ レジスタアクセス レジスタアクセス KVM 割り込み DPDK App2 e1000 PMD 割り込み uio 参考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf

ホスト -VM 間通信 ~virtio-net & pcap 経由 ~ user space on host Guest DPDK App2 user space on VM DPDK App1 virtio-net PMD uio kernel space on VM pcap PMD virtio-net tap client QEMU tap driver kernel space on host 46

ホスト -VM 間通信 ~virtio-net & pcap 経由 ~ App1 からの送信 QEMU tap client User DPDK App1 pcap PMD コピー Kernel コピー tap driver 注意黒線をまたぐとコンテキストスイッチ発生 Host virtio-net コピー 割り込み KVM Guest コピー パケットバッファ 割り込み 実デバイスをシミュレートしていない virtio-net は そもそも 送受信に際してレジスタアクセスを発生させない DPDK App2 virtio-net PMD 割り込み uio 参考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf

ホスト -VM 間通信 ~virtio-net & vhost & pcap 経由 ~ user space on host Guest DPDK App2 user space on VM DPDK App1 virtio PMD uio kernel space on VM pcap PMD tap driver kernel space on host virtio-net vhost-net tap client QEMU vhost-net は ホストのカーネル内で virtio-net のパケット送受信処理を行う仕組み よって 送受信の際に virtio-net は関わらなくなる 48

ホスト -VM 間通信 ~virtio-net & vhost & pcap 経由 ~ App1 からの送信 QEMU User DPDK App1 pcap PMD Kernel コピー tap driver コピー 注意黒線をまたぐとコンテキストスイッチ発生 tap client Host vhost-net 割り込み KVM Guest コピー パケットバッファ 割り込み DPDK App2 virtio-net PMD 割り込み uio 参考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf

ホスト -VM 間通信 ~virtio-net & cuse & vhost backend 経由 ~ user space on host DPDK App1 vhost backend eventfd kernel module kernel space on host DPDK App2 virtio PMD uio virtio-net CUSE Guest user space on VM CUSE を使って vhost-net の実装を DPDK App1 の中で行ってしまう! この場合 DPDK App1からゲ kernel ストの物理メモリにアクセスで space on VM きる必要がある ( ゲストの物理メモリをhugetlbfs 上から取得す QEMU る必要がある 読み書きの権限も必要 ) また 通知のために DPDK の提供する特別なカーネルモジュールが必要 Intel 考案! 50

ホスト -VM 間通信 ~virtio-net & cuse & vhost backend 経由 ~ App1 からの送信 User Kernel 注意黒線をまたぐとコンテキストスイッチ発生 Host QEMU DPDK App1 vhost backend コピー 割り込み event 通知 kernel module 割り込み KVM Guest パケットバッファ 割り込み App1 と App2 が共にポーリングしているので 通知は必要なし! DPDK App2 virtio-net PMD 割り込み uio 参考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf

ホスト -VM 間通信 ~virtio-net & vhost-user backend 経由 ~ user space on host DPDK App1 vhostuser backend DPDK App2 virtio PMD virtio-net eventfd Guest user space on VM QEMU-2.1 以上では vhost-net のバックエンドを ユーザ空間にインプリさせるための仕組みが実装されている (vhost-user) kernel space on VM よって CUSEを使う必要はなくなる QEMU なお この仕組みでも ゲストの物理メモリは hugetlbfsから取得する必要がある なお イベント通知には 通常の eventfd を使用する ( 特別なカーネルモジュールは必要ない ) kernel space on host 52

ホスト -VM 間通信 ~virtio-net & vhost-user backend 経由 ~ App1 からの送信 User Kernel 注意黒線をまたぐとコンテキストスイッチ発生 QEMU DPDK App1 Host vhost -user backend コピー 割り込み eventfd 割り込み KVM Guest パケットバッファ 割り込み App1 と App2 が共にポーリングしているので 通知は必要なし! DPDK App2 virtio-net PMD 割り込み uio 参考 https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-02.pdf

ホスト -VM 間通信 ~ その他 ~ 他にも いろいろありますが ここでは割愛 IVSHMEM + Ring MEMNIC PMD NEC 製 高速な転送を実現するものは 何らかの共有メモリを実現して そのうえでパケット交換するものです 54

55

DPDK アプリ例 ~open source のみ ~ アプリ名 ライセンス概要 lagopus BSD OpenFlow-1.3 対応のソフトウェアスイッチ dpdk-ovs BSD DPDK 対応した Open vswitch Packetgen BSD パケットジェネレータ dpdk-rumptcpip BSD ipaugenblick rumpkernel の DPDK 対応 GPL/BSD Linux TCP/IP スタックの DPDK ポーティング dpdk-odp BSD BSDのTCP/IPスタックをDPDKにポーティング ( ソースコードをいつまでも公開しないので 使 わない方が無難?) 56

まとめ 既存のフレームワークでは 高速転送を実現できない DPDKは ユーザランドから CPU メモリ NICを扱う仕組み NICは uio/vfio 経由 CPUは Affinity 管理 メモリは hugetlbfs 経由 ポーリングを効率的に行うことで高速化を達成 実際に DPDKを使用したアプリや製品が出始めている DPDK のコミュニティ Site: http://dpdk.org/ ML: dev@dpdk.org 57