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

Similar documents
160311_icm2015-muramatsu-v2.pptx

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

スライド 1

スライド 1

04-process_thread_2.ppt

TFTP serverの実装

スライド 1

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

PowerPoint プレゼンテーション

bitvisor_summit.pptx

昨年度までの研究紹介 および 研究計画

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

センサーデバイスへの仮想IP割り当て実験

スライド 1

【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

PowerPoint プレゼンテーション

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

アライドテレシス・コアスイッチ AT-x900 シリーズとディストリビューションスイッチ AT-x600 シリーズで実現するACLトラフィックコントロール

<4D F736F F F696E74202D20834A815B836C838B835C815B835882CC95E082AB95FB F4B2E B8CDD8AB B83685D>

IO Linux Vyatta PC

memo

提案書

用意するもの Crystal Signal Pi 本体 Raspberry Pi 第一世代 Model B+ 以降 microsd カード microusb ケーブル 2017 年 12 月 19 日 インストール方法 Raspbian のインストール microsd カードに Raspbian を

複数のシリアルデバイスを使う場合 rs232cj2 関数で複数のシリアルデバイスを使う場合には, 関数をコピーし, リネームすれば, 理論上いくつのシリアルデバイスでも使うことができる 例えば, rs232cj2_forsick.mexw64 rs232cj2_forhokuyo.mexw64 のよ

Trema を使って OpenFlow プログラミングを 始めてみませんか? 鈴木一哉 Trema 開発チーム 2012/4/13

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

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

_JANOG44_LINE_tsuchiya

ご使用上の注意

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

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

Microsoft PowerPoint - DEXCS2015_Salome_Installation pptx

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

[技術資料] PRIMERGY サーバブレードのLAN 冗長化

インストール先 PC 推奨環境 Intel Virtualization Technology 対応 CPU Windows 7 以降 64 bit メモリ 4 GB 以上 ハードディスク空き容量 20 GB 以上 インターネット接続 ( アップデートを うため ) ( 動作を保証するものではありま

第1回 ネットワークとは

Linux ドライバのインストール

パケットモニター (Wireshark) の使い方 第 1 版 1.Wireshark とは ネットワーク上 (LAN ケーブルに流れている ) のパケットを取得して その中の情報を画面に表示するソフトウェア (LAN アナライザーまたはパケットモニター ) の 1 つに Wiresh

DSP5Dアップグレードガイド

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

TRQerS - Introduction

TCP_BP3591 の説明 V /03/28 ROHM 社製 WIFi モジュール BP3591 を使用して 無線 LAN により TCP/IP 通信を行うプログラムです 簡単な文字列によるコマンド ( 例 : LED0 ON ) を受信して LED の ON/OFF を行います 受

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A


部内向けスキルアップ研修 「組込みOS自作入門」

Windows Server 2012 におけるネットワークインフラストラクチャアップデート MVP : 阿部直樹

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

PowerPoint プレゼンテーション

コア・スイッチAT-SBx908シリーズとデータセンタースイッチAT-DC2552XSシリーズで実現する10Gデータセンターネットワーク

Microsoft PowerPoint ppt [互換モード]

ループ防止技術を使用して OSPFv3 を PE-CE プロトコルとして設定する

Microsoft Word - CygwinでPython.docx

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

9.pdf

パススルー IPSecトンネル インターフェイスに AVC トラフィックを有効に する 回避策

Dual port LANカード(10GBASE-T)

外部ルート向け Cisco IOS と NXOS 間の OSPF ルーティング ループ/最適でないルーティングの設定例

HP ProLiant Gen8サーバー上でのLinuxによるNICの列挙

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

KADIAS Mac OS X 用事前環境準備手順書

ServerView RAID Manager VMware vSphere ESXi 6 インストールガイド

PowerPoint プレゼンテーション

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

BitVisor Updates in 2016

Red Hat Enterprise Linux 6 Portable SUSE Linux Enterprise Server 9 Portable SUSE Linux Enterprise Server 10 Portable SUSE Linux Enterprise Server 11 P

Congress Deep Dive

Presentation title (on one or two lines)

Taro-82ADAカ.jtd

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

wireshark dissector with lua

Microsoft PowerPoint - NV研究会_201404_amemiya_fin.pptx

スパコンに通じる並列プログラミングの基礎

CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000

Transcription:

作って覚える DPDK プログラミング Internet Week 2016 Dec 1, 2016 ( 株 ) インターネットイニシアティブ沖勝 m-oki@iij.ad.jp

Agenda DPDKの概要 さっそく作ってみる どんなふうに動いてるの? DPDKが提供している機能の紹介 DPDKを使った高速化の秘訣 動かすには下準備が必要 いくつかの疑問 DPDKプログラミングのまとめ 2

DPDK の概要 The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 3

ずばり なんなのか Data Plane Development Kit http://dpdk.org/ 高速パケット I/O 機能を提供するライブラリ Over 160Mfps とのこと 10GbE ワイヤーレートとか出せます 単体動作するスイッチやルータではありません プロトコルスタックでもありません C 言語で書かれています Linux, FreeBSD で使えます x86 だけでなく ARM や Power8, Tile-GX でも動きます ソース提供されているので基本はビルド 最近はパッケージ化されたものもあります BSD License です Linux kernel module は GPLv2 4

DPDK の歴史 2012 年 9 月 version 1.2.3 first public release 32/64bit x86 Linux のみ NIC は Intel の igb(gbe) と ixgbe(10gbe) のみ 当時は Intel DPDK 2016 年 4 月よりバージョン命名規則が年. 月に 現時点の最新は 16.11 Power8, Tile-GX, ARM(Cavium, RehiveTech, NXP) でも動作 Mellanox, Broadcom, Qlogic 等の NIC にも対応 Crypto driver(aes 等の暗号化サポート ) も提供されている 以降 17.02, 17.05, 17.08, 17.11 と年 4 回リリース 5

さっそく作ってみる The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 6

初期化コード #define NPORT 2 #define NRXQ 1 #define NTXQ 1 #define QLEN 144 init(int argc, char *argv[]) { ポートの初期化 受信キュー初期化 } rte_eal_init(argc, argv); rte_pktmbuf_pool_create( mbufpool, NB_MBUF, cache_size, 0, MBUF_SIZE, rte_socket_id()); for (portid= 0; portid < NPORT; portid++) { } コマンドライン処理 パケット用メモリプールの確保 rte_eth_dev_configure(portid, NRXQ, NTXQ, &portconf); for (n = 0; n < NRXQ; n++) { rte_eth_rx_queue_setup(portid, n, QLEN, ); } for (n = 0; n < NTXQ; n++) { rte_eth_tx_queue_setup(portid, n, QLEN, ); } 送信キュー初期化 7

Port0 Port1 へパケット転送 main(int argc, char *argv[]) { init(argc, argv); for (;;) { 初期化コード呼び出し 永久ループ Port0 からパケット受信 } } npkts = rte_eth_rx_burst(0, mbufs, NB_MBUF); rte_eth_tx_burst(1, mbufs, npkts); パケットを Port1 に送信 起動コマンドライン : sudo fwd_sample -c1 -n2 8

複数スレッドでパケット処理 struct ports { int inport; int outport; } ports[] = { { 0, 1 }, { 1, 0 } }; ここでは 2 スレッド動作を前提としています スレッドのエントリ関数 スレッドごとに異なる ID により送受信ポートを決定 thread() { inport = ports[rte_lcore_id()].inport; outport = ports[rte_lcore_id()].outport; } for (;;) { } ひとつのスレッドの処理は最初のサンプルと同じ npkts = rte_eth_rx_burst(inport, mbufs, NB_MBUF); rte_eth_tx_burst(outport, mbufs, npkts); 9

Port0 Port1 パケット転送 main(int argc, char *argv[]) { init(argc, argv); 初期化コード呼び出し 各コアで thread() を実行 rte_eal_mp_remote_launch(thread, NULL, CALL_MASTER); } rte_eal_mp_wait_lcore(); 全ての thread() の終了待ち 起動コマンドライン : sudo fwd_sample2 -c3 -n2 (16 進数 )3 は bit0,bit1 が 1 core0,core1 を使用する メモリチャネル数 1,2,4 のいずれか 10

望んだアプリにする 受信と送信の間に処理を挟み込む 送信先をダイナミックに決定する パケットの中身を加工する がんばれば スイッチやルータも作れます プロトコルスタックが不要な処理で威力を発揮 OpenFlow トラフィックジェネレータ ロードバランサー など 11

パケットデータの参照 操作 rte_eth_rx_burst() などで扱うのは mbuf 配列 struct rte_mbuf * *BSD mbuf そのものではないが似ている head room や tail room をあらかじめ空けてある 主な API Rte_pktmbuf_alloc() mbufの確保 (bulk 版 APIもある ) rte_pktmbuf_free() mbufの解放 rte_pktmbuf_mtod() mbuf 先頭データの取り出し rte_pktmbuf_len() パケット長の取得 rte_pktmbuf_prepend() 先頭に指定バイト数加える rte_pktmbuf_adj() 先頭から指定バイト数取り除く Rte_pktmbuf_append() 末尾に指定バイト数加える rte_pktmbuf_trim() 末尾から指定バイト数取り除く 12

パケットデータを扱う例 struct rte_mbuf *mbufs[nb_mbuf]; n_mbufs = rte_eth_rx_burst(portid, mbufs, NB_MBUF); for (n = 0; n < n_mbufs; n++) { mbuf = mbufs[n]; 先頭からのオフセット指定し 指定の型で取り出す typeoff = rte_pktmbuf_mtod_offset(mbuf, uint16_t *, 12); } switch (*typeoff) { case ETHERTYPE_IP: my_ip_input(mbuf); break; default: rte_pktmbuf_free(mbuf); } ether type を参照する dst mac (6bytes) src mac (6bytes) ether type (2bytes) Payload +0 +6 +12 +14 13

ここで当然の疑問 1 スレッド 1 コア? そのとおりです 永久ループ つまり ぐるぐるまわる 受信 APIはブロックするか? しません パケットを受信していなければ 0 個 pollやselect 相当のAPIは? CPU 利用率? 100% ありません 速度至上主義 CPU loadどれだけ食おうが とにかく速く コアやCPUソケットをめちゃくちゃ意識します 14

どんなふうに動いてるの? The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 15

おおまかな動作イメージ kernelをバイパスしてdpdkでパケット受信 パケット送信もDPDKによってkernelをバイパス 動作の主体はUser Process User Process DPDK Linux kernel NIC NIC 16

PMD (Poll Mode Driver) Linux の uio(userspace I/O) kernel module を利用 DPDK でビルドされる igb_uio.ko を組み込み NIC のドライバはすべて DPDK の中で実装 割込みを使わずポーリングするドライバのため PMD (Poll Mode Driver) と名付けられた 最初の実装は FreeBSD のドライバからの移植 17

コンテキストスイッチの抑制 スレッドが走るコアを固定する pthread_setaffinity_np(3) 1 スレッド 1 コア 4 スレッドなら 4 コア必要 PMD によって送受信割り込みを抑制 Page fault を抑制するための hugepage の利用 通常 4KB/page で実メモリがないと Page fault で確保 TLB miss 例外が発生して確保後に元の処理に戻る hugepage は 2MB/page あるいは 1GB/page データベースの高速化にも使われる 18

ゼロコピー パケット処理の際にコピーを不要とする 受信時に hugepage にパケットデータを書き込みポインタをユーザプログラムに渡す ユーザプログラムがポインタを送信 API に渡す 送信 API はコピーせずそのまま送信処理を実行 19

DPDK が提供している機能 The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 20

DPDK の主なライブラリの紹介 Environment Abstraction Layer (librte_eal) Ethernet 関連 (librte_ether) パケットデータ操作 (librte_mbuf) LPM (librte_lpm) ACL (librte_acl) ハッシュ関数 ハッシュテーブル (librte_hash) パケットのリオーダリング (librte_reorder) IP フラグメント処理 (librte_ip_frag) Lockless なリングバッファ (librte_ring) など ドキュメントにて解説されています ( 英語ですが ) http://dpdk.org/doc/guides/prog_guide/ 21

サンプルプログラム ~src/dpdk$ ls examples/ bond ipv4_multicast link_status_interrupt quota_watermark cmdline kni load_balancer rxtx_callbacks distributor l2fwd Makefile skeleton dpdk_qat l2fwd-cat multi_process tep_termination ethtool l2fwd-crypto netmap_compat timer exception_path l2fwd-jobstats nohuge-test vhost helloworld l2fwd-keepalive packet_ordering vhost_xen ip_fragmentation l3fwd performance-thread vmdq ip_pipeline l3fwd-acl ptpclient vmdq_dcb ip_reassembly l3fwd-power qos_meter vm_power_manager ipsec-secgw l3fwd-vf qos_sched ~/src/dpdk$ 22

DPDK を使った高速化の秘訣 The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 23

DPDK を使った高速化の秘訣 ハードウェアリソースを活用する NIC のオフロード機能 (checksum, TSO) マルチキュー NIC (RSS, flow director) 可能ならスレッド間でリソースを共有しない たとえばスレッド ( コア ) ごとに持たせる マルチキュー NIC のキューごとにコアを割り当てる CPU がなるべく待たないようにする なるべくロックしない なるべくパケットをバルクで処理する なるべくコピーしない 24

ハードウェア活用例 マルチキュー NIC を利用 Intel の GbE NIC では最大 8 queue RSS(Receive Side Scaling; NIC の機能 ) で振り分け IPv4 src, dst の組から hash 値を計算し振り分ける 送信先におけるパケット順序性が保証される それぞれのスレッドが互いを気にせず処理 NIC Queue0 DPDK PMD Queue1 Thread A (core 0) Thraed B (core 1) 25

高速化の秘訣 2 コアごとに処理内容を分ける たとえば I/O 処理とパケットフィルタリング OSS の OpenFlow スイッチ Lagopus の手法 OpenFlow rx rx OpenFlow OpenFlow OpenFlow tx tx rx 2 コア OpenFlow worker 4 コア tx 2 コア 26

ボトルネックの調査 perf コマンド サブコマンドがいろいろあるがまずは perf top 空ループも高負荷に見える点に注意 27

動かすには下準備が必要 The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 28

下準備 : 実は大きなハードル DPDK のビルド DPDK のトップディレクトリ $RTE_SDK に cd しておき./tools/setup.sh を実行 対話形式でビルドできる 対話形式でなく make を使うときは下記のようにする make T=x86_64-native-linuxapp-gcc config make hugepage の予約 Linux kernel 起動パラメータに追加 Ubuntu なら /etc/default/grub を編集して update-grub 例 : GRUB_CMDLINE_LINUX= hugepages=2048 /etc/fstab にエントリ追加 none /mnt/huge hugetlbfs defaults 0 0 一度再起動が必要 29

もう一つの下準備 PMD 動作に必要なカーネルモジュール組み込み sudo modprobe uio sudo insmod $RTE_SDK/build/kmod/igb_uio.ko UIO を使うよう NIC のドライバの差し替え sudo $RTE_SDK/tools/dpdk-devbind.py パラメータなしで Usage が表示される 例 : dpdk-devbind.py --bind=igb_uio 01:00.0 この例の 01:00.0 は PCI アドレス 値は ethtool i eth1 など実行するとわかる DPDK のバージョンが古いとスクリプト名が違う OS から NIC が見えなくなる (!) 再起動のたびに上記を実行する必要あり 30

いくつかの疑問 The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 31

いくつかの疑問 仮想環境でも動く? オーバーヘッドは? 動作します virtio PMD や vhost PMD を使えます SR-IOV も使えます CPU100% については後述 通常 OS の処理よりいいって本当? DPDK はプロトコルスタックを持っていません DPDK や third party ソフトウェアがない機能は自作が必要 最近カーネル内で完結するフレームワークが話題だが (ebpf, XDP) 一長一短 一部のパケットだけ DPDK で処理したい 可能? 可能と言えば可能 DPDK 提供の KNI(Kernel Network Interface) か tap を使う OS で処理させるパケットのスループットは落ちる うまくすみわけできそうな例 L3 処理で速度を要求されない ICMP はカーネルに その他は DPDK で 32

CPU100% 問題解決の糸口 DPDK のパケット受信に機能が追加されてます interrupt mode 内部的には パケット受信割り込みを uio の fd への poll/select で検知し callback function を呼び出す DPDK の使い方としては関数を登録してフラグを立てておけばこのモードになる Interrupt modeと従来のポーリングループを併用して CPU loadを下げつつ高速転送を実装できそうです いわばLinux NAPIのDPDK 版 ただしinterrupt modeがあるだけなので自作が必要 33

C 言語以外で使えますか? C++: もちろん使えます (extern C ) 他の言語は wrapper を使って呼び出す Go: go-dpdk https://github.com/melvinw/go-dpdk Rust: rust-dpdk https://github.com/flier/rust-dpdk DPDK のを活かす高速性が維持できてるかは不明 34

DPDK 関連の OSS を少し紹介 Pktgen-DPDK http://dpdk.org/browse/apps/pktgen-dpdk/refs/ DPDK を使ったトラフィックジェネレータ Lagopus https://lagopus.github.io OpenFlow 1.3 対応ソフトウェアスイッチ Seastar http://www.seastar-project.org/ サーバーアプリケーション向けのフレームワーク VPP https://wiki.fd.io/view/vpp Cisco のパケット処理フレームワーク mtcp https://github.com/eunyoung14/mtcp マルチコアを活用したユーザスペース TCP 実装 35

DPDK プログラミングのまとめ The DPDK logos are provided by Intel under a Creative Commons Attribution-NoDerivatives 4.0 License (CC BY-ND 4.0). 36

まとめ 導入 下準備は少々面倒 (3rd party 含め ) ライブラリにない機能は全部自分で組む必要がある プログラミング自体は比較的シンプル サンプルプログラムも豊富 OSS の活用例も この機会に DPDK プログラミングを始めてみませんか? 37