16
DPDKを用いた ネットワークスタック, 高性能通信基盤 サイボウズ・ラボユース成果報告 Hiroki SHIROKURA @slankdev [email protected]

DPDKを用いたネットワークスタック,高性能通信基盤開発

Embed Size (px)

Citation preview

Page 1: DPDKを用いたネットワークスタック,高性能通信基盤開発

DPDKを用いたネットワークスタック,高性能通信基盤

サイボウズ・ラボユース成果報告

Hiroki SHIROKURA @[email protected]

Page 2: DPDKを用いたネットワークスタック,高性能通信基盤開発

自己紹介

Hiroki SHIROKURA

- @slankdev- Security Camp 15,16tutor- 15年間 テニスプレーヤー (卒業)- 2年間  パケリスト (卒業)- 高速パケット仙道にすすむ (修行中)

開発物

- パケット解析ライブラリ- Wireshark TUI版 のようなもの- DPDKを用いたネットワークスタック- DPDKを用いた高性能通信基盤 (開発中)

ラボユース

- C++ソフトウェア開発- テーマ : 高性能通信, C++11- メンター: 光成滋生氏

Page 3: DPDKを用いたネットワークスタック,高性能通信基盤開発

活動の流れ2016年度

4, 5月

- DPDKの入門- 使い方理解やドキュメント読経

6,7月

- ネットワークスタック開発のための勉強開始

- BSD, Linuxの実装を見る- C++に苦しみ、できないと

光成さんに泣きつく- ネットワークスタック開発開始

8月 セキュキャンチューター , インターン

9,10,11,12月

- ARPの実装- IP, ICMPの実装- UDPの実装- TCPの実装- ここで一応目標達成- 高性能通信勉強開始 (次の目標)

1, 2, 3月

- DPDKで高性能通信をするための勉強- こまごましたものを実装しまくる- 高速PCルーターなフレンズにスパイ活動

Page 4: DPDKを用いたネットワークスタック,高性能通信基盤開発

活動の流れ2016年度

4, 5月

- DPDKの入門- 使い方理解やドキュメント読経

6,7月

- NW-Stack開発のための勉強開始- BSD, Linuxの実装を見る- C++に苦しみ、できないと

光成さんに泣きつく- ネットワークスタック開発開始

8月 セキュキャンチューター , インターン

9,10,11,12月

- ARPの実装- IP, ICMPの実装- UDPの実装- TCPの実装- ここで一応目標達成- 高性能通信勉強開始 (次の目標)

1, 2, 3月

- 真のDPDKの使い方勉強- こまごましたものを実装しまくる- 高速PCルーターなフレンズにスパイ活動

要約:ネットワークスタック実装のための勉強

ネットワークスタック設計

ネットワークスタック実装

高性能通信の勉強

高性能通信の実験

高性能通信の実験を行うためのフレームワークを設計/開発

その他ツールをすこし開発

Page 5: DPDKを用いたネットワークスタック,高性能通信基盤開発

DPDKとは

カーネルをバイパスしてユーザランドから直接デバ

イスアクセスを行い高性能通信することを可能にし

たフレームワーク

コンテキストスイッチを抑制して、各 CPUでスレッド

固定をさせる

NICはビジーウェイトのpollingで監視してCPU使用

率は100%に張り付く

引用: http://www.accton.com/Newspage.asp?sno=87

Page 6: DPDKを用いたネットワークスタック,高性能通信基盤開発

ラボユース長期目標 理想と現実

目標: 高性能なネットワークスタック

DPDKをバックエンドBSDの伝統的な実装を参考

機能目標

- Ether,ARP,IP,ICMP,UDP,TCP

性能目標

- Linuxより高性能(高性能 ≡ 低遅延, 高スループット )

具体的にはどんな機能があったりするか

- Fragmentation- Sliding Window- 3 Way Handshake- Retransmission- Reply Ack- Reorder- etc...

Page 7: DPDKを用いたネットワークスタック,高性能通信基盤開発

IP

ラボユース長期目標 理想と現実

結果: Smallなネットワークスタック

- http://github.com/slankdev/stcp

- 実装した: Ether,ARP,IP,UDP,ICMP,TCP

- BSDとはだいぶ設計思想が違う

- マルチコアをほとんどつかってない

- DPDKのAPIと手実装がごちゃ混ぜ

- TCPの完成度以外は文句はなし

ifnet ifnet ifnet

dataplane

Ethernet

AR

P

TCP UDPICMP

TCP

sockTC

P sock

TCP

sock

UD

P sock

UD

P sock

UD

P sock

UD

P sock

UD

P sock

UD

P sock

TCP

sockTC

P sock

TCP

sock

APIs

CPU0 CPU1

APP1

CPU2

APP2

NIC NIC NIC NIC NIC

青: STCP灰: HW

Page 8: DPDKを用いたネットワークスタック,高性能通信基盤開発

DUTTESTER

ネットワークスタック開発

レイテンシ計測: 構成計測ツール : Ping/Hping3 (高機能なping)

マシンスペック

- TESTER- CPU : Core i7 2700K @3.5GHz 8Core- NIC : Intel X540-T2 10GbE- OS : Ubuntu 16.04 LTS- DPDK: Version 16.07 LTS- NetworkStack: STCP (1coreのみ使用)

- DUT- CPU : Core i7 3930K @3.2GHz 12Core- NIC : Intel X540-T2 10GbE- OS : Ubuntu 16.04LTS- NetworkStack: Linux 4.8.0-36-generic

10GNIC10GNIC

比較対象

- Linuxカーネルのnative NW Stack- STCP (自作のNW Stack)

Page 9: DPDKを用いたネットワークスタック,高性能通信基盤開発

ネットワークスタック開発

レイテンシ計測: 結果

Linux 0.10 ms

STCP 0.05 ms

表. Pingレイテンシ

まあとりあえず , 2倍, Linuxより速いね, やったぜ

 ランバ・ラル

 「見事だな.しかし小僧,自分の力で勝ったのではないぞ .そのDPDKの性能のおかげだという事を忘れるな .」

Page 10: DPDKを用いたネットワークスタック,高性能通信基盤開発

次は...

現状DPDKの性能は10%くらいしか引き出せていない

限界までDPDKを使うとどれくらい高性能通信できるのか

DPDKアプリケーション設計のベストプラクティス

プロ「完全にDPDKを使いこなすには、人間様によるチューニングが必要」

次のテーマ: 以下を達成する高性能通信基盤開発

- SWの高性能通信の限界を探す

- 自動チューニング機構 (人間様に頼らない)

Page 11: DPDKを用いたネットワークスタック,高性能通信基盤開発

高性能通信基盤開発

現状行ったこと

1. 理解不足な部分の勉強,実験など

- ハードウェア支援機構の理解の試験

- スレッドパターンの試験

2. フレームワークの開発

- ハードウェア支援機構の設定を簡単にする

- スレッド操作をしやすいようなフロントエンド

Page 12: DPDKを用いたネットワークスタック,高性能通信基盤開発

高性能通信基盤開発: ハードウェア支援機構

RSS (Receive Side Scaling)

MEM

CPU

NIC

NICが受け取ったパケットをHWで複数のCPUに振り分

けるためハードウェア支援機構

NICにQueueを持たせ、それぞれ別のメモリに DMAする、それらを別々のコアから監視して、スケールアウトさ

せる

Flowは4tuple (Srcip,Dstip,Srcport,Dstport)

使い方がよく分からなかったが

今週やっと方法がわかった。

パフォーマンス計測はまだ

RxQue

RxQue

TxQue

Hash func

CoreCore CoreCore

RxThread

RxThread

TxThread Thread

Phy

Dscrptr

Indirection Table

Dscrptr Dscrptr

Page 13: DPDKを用いたネットワークスタック,高性能通信基盤開発

高性能通信基盤開発

スレッドパターンの最適化: Forwarderの場合NIC0 Rx

NIC1 Rx

Rx Thrd

NIC0 Tx

NIC1 Tx

Tx Thrd

Wk Thrd

NIC0 Rx

NIC0 Tx

Port0 Thrd

NIC1 Rx

NIC1 Tx

Port1 Thrd

Wk Thrd

TxRx独立パターンRx 監視スレッド/Tx 監視スレッドパケット処理を行うスレッド

ポート独立パターンPort0 監視スレッド/Port1 監視スレッドパケット処理を行うスレッド

ポートTxRx独立パターンPort0 Rx 監視スレッド/Port0 Tx 監視スレッドPort1 Rx 監視スレッド/Port1 Tx 監視スレッドパケット処理を行うスレッド

フロー独立パターンFlowスレッド 0→1Flowスレッド 1→0

フローTxRx独立パターンFlowスレッド 0→1/Flowスレッド 1→0Port0 Rx 監視スレッド/Port0 Tx 監視スレッドPort1 Rx 監視スレッド/Port1 Tx 監視スレッド

NIC0 Rx

NIC1 Rx

Port0 Rx

ThrdNIC0 Tx

NIC1 Tx

Wk Thrd

Port1 Rx

Thrd

Port0 Tx

Thrd

Port1 Tx

Thrd

NIC0 Rx

NIC1 Rx

NIC1 Tx

NIC0 TxFlow 1→0 Thrd

Flow 0 →1 Thrd

NIC0 Rx

NIC1 Rx

Rx0Thrd

NIC1 Tx

NIC0 Tx

Rx1Thrd

Tx1 Thrd

Tx0 Thrd

Flow 1→0 Thrd

Flow 0→1 Thrd

何を安定させたいかに合わせて選択する

- 各ポートを安定- tx,rxを安定- フローを安定

10GbEくらいだと結構余裕で性能がでた。

2portのNICは性能が出しきれない?RSSで解決できるかも

Page 14: DPDKを用いたネットワークスタック,高性能通信基盤開発

高性能通信基盤開発

現時点での進捗

これらを自由に扱うためのフロントエンドの実装

- VTY Shell- デバイスコンフィグ設定インターフェース

- スレッド動的操作インターフェース

- lthread C++ 対応 patch- プロトコルアナライザ インターフェース

Page 15: DPDKを用いたネットワークスタック,高性能通信基盤開発

まとめ

- DPDKを用いたSmallなネットワークスタック

- DPDKを用いた高性能通信の試験

- 試験を行う用のフレームワーク

- C++の知識、設計技法

本やサイトに書いてあることは簡単だが、

それを実際に使えるようにするまでのコストが高い

Page 16: DPDKを用いたネットワークスタック,高性能通信基盤開発

最後に

Socketの使い方さえよく理解できてない状況から

始めたので一応結構成長できたが、まだまだ

lthread(DPDKの一部)のC++対応のpatchを送ったらIntelのおじさんが賛成してくれた

https://mail-archive.com/[email protected]/msg60686.html

in/outのバランスがむずい

- in 知識

- out 設計実装, 研究

光成さん、一年間本当にお世話になりました。

今後も精進します。