Upload
slankdev
View
167
Download
2
Embed Size (px)
Citation preview
1
サイボウズ・ラボユース第 6 期中間報告@slankdev
7/15/16 ラボユース第 6 期 中間報告
2
自己紹介oすらんくoTwitter: @slankdevoGitHub: slankdevo都内の理工学部 3 年oセキュリティ・キャンプ 2015 修了 , 2016 チューターoパケットとか開発とかが好きですo最近 HW にも興味が湧いてきました
7/15/16 ラボユース第 6 期 中間報告
3
Agenda1. 今期のラボユースのテーマ2. とりあえずここまでやったこと3. 今後にやるべきことここまでは勉強の時間がほとんどになってしまい、全然かたちに残ることができていないので、どんなことをしたのかを報告します。
7/15/16 ラボユース第 6 期 中間報告
4
今期のラボユースのテーマoTCP/IP のプロトコルスタックの開発ohttp://github.com/slankdev/stcp.git
7/15/16 ラボユース第 6 期 中間報告
5
stcp についてoユーザランドで動く TCP/IP プロトコルスタックoゼロコピーoマルチインターフェースをサポートoIO エンジンは DPDK を使用oC++11 で開発
7/15/16 ラボユース第 6 期 中間報告
6
目標達成のためにoTCP/IP のプロトコルスタックの伝統的設計の知識o既存の OSS を参考これらのことを円滑に進めるための方法とかを勉強していました
7/15/16 ラボユース第 6 期 中間報告
7
とりあえずここまでやったことoDPDK の使い方をまなぶoプロトコルスタックの設計実装をみるo開発ツールを学ぶ形にのこるものが何もない !!!
7/15/16 ラボユース第 6 期 中間報告
8
DPDK (Data Plane Developing Kit)oIntel が開発していた超高速パケット IO の ユーザランドドライバoいまだにうまく動かないとこがあります。。oIntelNIC を中心にサポート ( なくても開発はできます !)
日本語の文献ほとんどなし
7/15/16 ラボユース第 6 期 中間報告
9
DPDK とは
7/15/16 ラボユース第 6 期 中間報告
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 期 中間報告
11
今回これをostcp ではパケットの入出力で DPDK を使用して開発oC++ で開発をするので、ラップ作業oそのまま C++ でコンパイルすると怒られる -> OSv の開発チームが非公式な patch を ..
oDPDK が雛形 Makefile を用意していてそれもなんとか
7/15/16 ラボユース第 6 期 中間報告
12
C++ で使うためにoOSv の patch を当てた
7/15/16 ラボユース第 6 期 中間報告
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 期 中間報告
14
DPDK の使い方o各関数をラップ -> 処理の失敗時は例外を投げるようにoDPDK の機能は OS 共有なので、 DPDK を管理するクラスをシングルトンとしてクラス設計oInit 処理とかをまとめる -> 結構たくさんあるoリングバッファのサイズとかをある程度設定可能に
7/15/16 ラボユース第 6 期 中間報告
15
伝統的なプロトコルスタックoBSD の実装中心に参考oLinux カーネルと FreeBSD の実装を比較
7/15/16 ラボユース第 6 期 中間報告
16
ハイレイヤな実装oメッセージバッファの線形リストを用いて、 パケットを管理している。
◦ Linux: skbuff 構造体◦ BSD: mbuf 構造体◦ DPDK: rte_mbuf 構造体o各プロトコルモジュールごとにそれを用意しているっぽい
7/15/16 ラボユース第 6 期 中間報告
17
mbuf についてoDPDK でも mbuf を実現した構造体を用意されている。orte_mbuf 構造体
7/15/16 ラボユース第 6 期 中間報告
18
典型的な mbuf の例
7/15/16 ラボユース第 6 期 中間報告
19
こんな FIFO データ構造
7/15/16 ラボユース第 6 期 中間報告
ここからとりだし
ここについか
20
ゼロコピーでデータ移動
7/15/16 ラボユース第 6 期 中間報告
21
ゼロコピーでデータ移動
7/15/16 ラボユース第 6 期 中間報告
22
mbuf の使われ方
7/15/16 ラボユース第 6 期 中間報告
23
DPDK でのパケット送信
7/15/16 ラボユース第 6 期 中間報告
24
開発ツールoSystemtap や valgrin dとかの使い方をすこし勉強しました。o本日は systemtap について報告
7/15/16 ラボユース第 6 期 中間報告
25
Systemtapo実行中のカーネルの簡易情報を超簡単に フックすることができるツールoカーネルの関数の呼び出しなどを動的にフックするoパケット送信部分でどのようなコードで実装されているか
7/15/16 ラボユース第 6 期 中間報告
26
net/packet/af_packet.c の関数をフックo以下のようなスクリプト
7/15/16 ラボユース第 6 期 中間報告
27
net/packet/af_packet.c の関数をフックo今回使用するサンプルコード
7/15/16 ラボユース第 6 期 中間報告
28
fd.open_if(dev) の中身
7/15/16 ラボユース第 6 期 中間報告
29
socket fd の作成時osocket()oioctl()obind()oioctl()oioctr()
7/15/16 ラボユース第 6 期 中間報告
30
write() でのパケット送信時owrite(fd, buf, sendlen);
7/15/16 ラボユース第 6 期 中間報告
31
Systemtap の使い道osocket の裏側を見ていきたいoいろいろな組み合わせがある
◦ AF_INET, SOCK_STREAM◦ AF_INET, SOCK_RAW◦ AF_PACKET, SOCK_RAW◦ etc …
o各プロトコルのモジュールのつながりを感じ取る
7/15/16 ラボユース第 6 期 中間報告
32
Systemtap 導入方法oデバッグ情報が含まれるカーネルを用意する
◦ コンパイルされたイメージを apt や yum でインストール◦ 自力でビルドする
◦ 伝統的方法 ◦ ディストリビューションの助けを借りる
ohttps://github.com/slankdev/documents/blob/master/wiki/systemtap/install.md
7/15/16 ラボユース第 6 期 中間報告
33
今後にやるべきことo[ 近い目標 ] IP プロトコルをたたく部分を実装
◦ IP◦ ARP◦ Ethernet
oRaw socket を systemtap でフックしていろいろ見てみたいo既存のカーネルと速度比較oRdtsc で正確に計測
7/15/16 ラボユース第 6 期 中間報告
34
DPDK がうまく動いてくれない問題
7/15/16 ラボユース第 6 期 中間報告
ここで step 実行しないとパケットが送られないクソ問題開発では直接 HW にバインドしないで、libpcap を通して触っているので作業は問題なく進みます