34
サササササ ササササササ 6サ ササササ @slankdev 7/15/ 16 ササササササ 6 サ ササササ 1

サイボウズ・ラボユース中間報告会

Embed Size (px)

Citation preview

Page 1: サイボウズ・ラボユース中間報告会

1

サイボウズ・ラボユース第 6 期中間報告@slankdev

7/15/16 ラボユース第 6 期 中間報告

Page 2: サイボウズ・ラボユース中間報告会

2

自己紹介oすらんくoTwitter: @slankdevoGitHub: slankdevo都内の理工学部 3 年oセキュリティ・キャンプ 2015 修了 , 2016 チューターoパケットとか開発とかが好きですo最近 HW にも興味が湧いてきました

7/15/16 ラボユース第 6 期 中間報告

Page 3: サイボウズ・ラボユース中間報告会

3

Agenda1. 今期のラボユースのテーマ2. とりあえずここまでやったこと3. 今後にやるべきことここまでは勉強の時間がほとんどになってしまい、全然かたちに残ることができていないので、どんなことをしたのかを報告します。

7/15/16 ラボユース第 6 期 中間報告

Page 4: サイボウズ・ラボユース中間報告会

4

今期のラボユースのテーマoTCP/IP のプロトコルスタックの開発ohttp://github.com/slankdev/stcp.git

7/15/16 ラボユース第 6 期 中間報告

Page 5: サイボウズ・ラボユース中間報告会

5

stcp についてoユーザランドで動く TCP/IP プロトコルスタックoゼロコピーoマルチインターフェースをサポートoIO エンジンは DPDK を使用oC++11 で開発

7/15/16 ラボユース第 6 期 中間報告

Page 6: サイボウズ・ラボユース中間報告会

6

目標達成のためにoTCP/IP のプロトコルスタックの伝統的設計の知識o既存の OSS を参考これらのことを円滑に進めるための方法とかを勉強していました

7/15/16 ラボユース第 6 期 中間報告

Page 7: サイボウズ・ラボユース中間報告会

7

とりあえずここまでやったことoDPDK の使い方をまなぶoプロトコルスタックの設計実装をみるo開発ツールを学ぶ形にのこるものが何もない !!!

7/15/16 ラボユース第 6 期 中間報告

Page 8: サイボウズ・ラボユース中間報告会

8

DPDK (Data Plane Developing Kit)oIntel が開発していた超高速パケット IO の ユーザランドドライバoいまだにうまく動かないとこがあります。。oIntelNIC を中心にサポート ( なくても開発はできます !)

日本語の文献ほとんどなし

7/15/16 ラボユース第 6 期 中間報告

Page 9: サイボウズ・ラボユース中間報告会

9

DPDK とは

7/15/16 ラボユース第 6 期 中間報告

Page 10: サイボウズ・ラボユース中間報告会

10

レイテンシ比較okernel と DPDK の速度比較をしてみましたohttp://blog.slankdev.net/2016/05/25/dpdk-latency/

oCPU が 3GHz で 64byte のショートパケットで速度計測oKernel: 約 3000clock -> 約 0.5GbpsoDPDK: 約 30clock -> 約 50Gbps

7/15/16 ラボユース第 6 期 中間報告

Page 11: サイボウズ・ラボユース中間報告会

11

今回これをostcp ではパケットの入出力で DPDK を使用して開発oC++ で開発をするので、ラップ作業oそのまま C++ でコンパイルすると怒られる -> OSv の開発チームが非公式な patch を ..

oDPDK が雛形 Makefile を用意していてそれもなんとか

7/15/16 ラボユース第 6 期 中間報告

Page 12: サイボウズ・ラボユース中間報告会

12

C++ で使うためにoOSv の patch を当てた

7/15/16 ラボユース第 6 期 中間報告

Page 13: サイボウズ・ラボユース中間報告会

13

DPDK 導入方法1. IntelNIC が乗った PC を用意2. 必要なパッケージをインストール3. カーネルコンフィグを調べる4. Hugepages を有効化5. Hugepages を DPDK から触れるようにするohttp://blog.slankdev.net/2016/05/08/dpdk-setup/ohttps://github.com/slankdev/dpdk/

7/15/16 ラボユース第 6 期 中間報告

Page 14: サイボウズ・ラボユース中間報告会

14

DPDK の使い方o各関数をラップ -> 処理の失敗時は例外を投げるようにoDPDK の機能は OS 共有なので、 DPDK を管理するクラスをシングルトンとしてクラス設計oInit 処理とかをまとめる -> 結構たくさんあるoリングバッファのサイズとかをある程度設定可能に

7/15/16 ラボユース第 6 期 中間報告

Page 15: サイボウズ・ラボユース中間報告会

15

伝統的なプロトコルスタックoBSD の実装中心に参考oLinux カーネルと FreeBSD の実装を比較

7/15/16 ラボユース第 6 期 中間報告

Page 16: サイボウズ・ラボユース中間報告会

16

ハイレイヤな実装oメッセージバッファの線形リストを用いて、 パケットを管理している。

◦ Linux: skbuff 構造体◦ BSD: mbuf 構造体◦ DPDK: rte_mbuf 構造体o各プロトコルモジュールごとにそれを用意しているっぽい

7/15/16 ラボユース第 6 期 中間報告

Page 17: サイボウズ・ラボユース中間報告会

17

mbuf についてoDPDK でも mbuf を実現した構造体を用意されている。orte_mbuf 構造体

7/15/16 ラボユース第 6 期 中間報告

Page 18: サイボウズ・ラボユース中間報告会

18

典型的な mbuf の例

7/15/16 ラボユース第 6 期 中間報告

Page 19: サイボウズ・ラボユース中間報告会

19

こんな FIFO データ構造

7/15/16 ラボユース第 6 期 中間報告

ここからとりだし

ここについか

Page 20: サイボウズ・ラボユース中間報告会

20

ゼロコピーでデータ移動

7/15/16 ラボユース第 6 期 中間報告

Page 21: サイボウズ・ラボユース中間報告会

21

ゼロコピーでデータ移動

7/15/16 ラボユース第 6 期 中間報告

Page 22: サイボウズ・ラボユース中間報告会

22

mbuf の使われ方

7/15/16 ラボユース第 6 期 中間報告

Page 23: サイボウズ・ラボユース中間報告会

23

DPDK でのパケット送信 

7/15/16 ラボユース第 6 期 中間報告

Page 24: サイボウズ・ラボユース中間報告会

24

開発ツールoSystemtap や valgrin dとかの使い方をすこし勉強しました。o本日は systemtap について報告

7/15/16 ラボユース第 6 期 中間報告

Page 25: サイボウズ・ラボユース中間報告会

25

Systemtapo実行中のカーネルの簡易情報を超簡単に フックすることができるツールoカーネルの関数の呼び出しなどを動的にフックするoパケット送信部分でどのようなコードで実装されているか

7/15/16 ラボユース第 6 期 中間報告

Page 26: サイボウズ・ラボユース中間報告会

26

net/packet/af_packet.c の関数をフックo以下のようなスクリプト

7/15/16 ラボユース第 6 期 中間報告

Page 27: サイボウズ・ラボユース中間報告会

27

net/packet/af_packet.c の関数をフックo今回使用するサンプルコード

7/15/16 ラボユース第 6 期 中間報告

Page 28: サイボウズ・ラボユース中間報告会

28

fd.open_if(dev) の中身

7/15/16 ラボユース第 6 期 中間報告

Page 29: サイボウズ・ラボユース中間報告会

29

socket fd の作成時osocket()oioctl()obind()oioctl()oioctr()

7/15/16 ラボユース第 6 期 中間報告

Page 30: サイボウズ・ラボユース中間報告会

30

write() でのパケット送信時owrite(fd, buf, sendlen);

7/15/16 ラボユース第 6 期 中間報告

Page 31: サイボウズ・ラボユース中間報告会

31

Systemtap の使い道osocket の裏側を見ていきたいoいろいろな組み合わせがある

◦ AF_INET, SOCK_STREAM◦ AF_INET, SOCK_RAW◦ AF_PACKET, SOCK_RAW◦ etc …

o各プロトコルのモジュールのつながりを感じ取る

7/15/16 ラボユース第 6 期 中間報告

Page 32: サイボウズ・ラボユース中間報告会

32

Systemtap 導入方法oデバッグ情報が含まれるカーネルを用意する

◦ コンパイルされたイメージを apt や yum でインストール◦ 自力でビルドする

◦ 伝統的方法 ◦ ディストリビューションの助けを借りる

ohttps://github.com/slankdev/documents/blob/master/wiki/systemtap/install.md

7/15/16 ラボユース第 6 期 中間報告

Page 33: サイボウズ・ラボユース中間報告会

33

今後にやるべきことo[ 近い目標 ] IP プロトコルをたたく部分を実装

◦ IP◦ ARP◦ Ethernet

oRaw socket を systemtap でフックしていろいろ見てみたいo既存のカーネルと速度比較oRdtsc で正確に計測

7/15/16 ラボユース第 6 期 中間報告

Page 34: サイボウズ・ラボユース中間報告会

34

DPDK がうまく動いてくれない問題 

7/15/16 ラボユース第 6 期 中間報告

ここで step 実行しないとパケットが送られないクソ問題開発では直接 HW にバインドしないで、libpcap を通して触っているので作業は問題なく進みます