Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
klab インターン成果物発表
Search
khwarizmi
August 31, 2018
Programming
0
300
klab インターン成果物発表
khwarizmi
August 31, 2018
Tweet
Share
More Decks by khwarizmi
See All by khwarizmi
IntelNIC 送受信を学ぶ
khwarizmi
3
940
NICのデバドラ開発
khwarizmi
0
170
ハードウェア乱数を用いた謝辞代表者の決定
khwarizmi
0
82
僕はDPDKをやっている人ではありません(XDP・netmap入門)
khwarizmi
1
750
ネットワーク性能調査ちょっとやってみる
khwarizmi
0
210
Z4「高速なFW/IDSの実装」
khwarizmi
0
170
HIGHSPEED PACKET IO
khwarizmi
0
100
Other Decks in Programming
See All in Programming
M5UnitUnified 最新動向 2025/05
gob
0
130
インプロセスQAにおいて大事にしていること / In-process QA Meetup
medley
0
140
カオスに立ち向かう小規模チームの装備の選択〜フルスタックTSという装備の強み _ 弱み〜/Choosing equipment for a small team facing chaos ~ Strengths and weaknesses of full-stack TS~
bitkey
1
130
七輪ライブラリー: Claude AI で作る Next.js アプリ
suneo3476
1
180
Dissecting and Reconstructing Ruby Syntactic Structures
ydah
3
2.1k
On-the-fly Suggestions of Rewriting Method Deprecations
ohbarye
3
5k
監視 やばい
syossan27
12
10k
今話題のMCPサーバーをFastAPIでサッと作ってみた
yuukis
0
120
ComposeでのPicture in Picture
takathemax
0
130
Orleans + Sekiban + SignalR でリアルタイムWeb作ってみた
tomohisa
0
240
エンジニアが挑む、限界までの越境
nealle
1
320
Ruby で作る RISC-V CPU エミュレーター / RISC-V CPU emulator made with Ruby
hayaokimura
5
770
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Done Done
chrislema
184
16k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
For a Future-Friendly Web
brad_frost
177
9.7k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
105
19k
Statistics for Hackers
jakevdp
798
220k
Six Lessons from altMBA
skipperchong
28
3.8k
How to Ace a Technical Interview
jacobian
276
23k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Making the Leap to Tech Lead
cromwellryan
133
9.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
GitHub's CSS Performance
jonrohan
1031
460k
Transcript
インターン成果物発表 河原 颯太
自己紹介 ・河原颯太(かわはらそうた) @khwarizmi6514 ・法政大学応用情報工学科 学部4年 金井(ネットワークセキュリティ)研究室所属 ・小学5年から野球を初めて高校3年までやっていた. ・春日部高校出身です! (これを言うといろんなところで先輩後輩が釣れることに最近気 が付いた)
・パソコンとは無縁の生活だったが, 大学入学時, 気が付いたらパソコンをやらなければ いけなくなっていた. ・元は数学が少しだけ好きだっただけの人. 最近非古典論理学に興味あるけどあんまり やってない. 今は数学嫌いだし全くできないです.
今までやってきたこと ・(大学)1年次, なんとなくプログラミング入門する. (C, C++) ・2年進学前, サーバ保守管理みたいなお仕事のインターンを始める. linuxに初めて触っ た! そのままアルバイトに.
・3年春, 今の研究室に配属. @slankdevにタゲられる. ・3年秋, ゲーム会社のインフラ部 dockerをやる. ・3年秋-冬, @slankdevにパケットを食べさせられる. ・4年, DPDKをやる.
インターンの課題 DPDK環境に向けた ネットワークスタックの実装
テーマの経緯 学部の研究テーマがDPDKを用いたネットワークスタック実装に決定 ↓ ネットワークスタックとかよくわかんねえしとりあえずDPDKいじいじ ↓
DPDKとは ・Data Plane Development Kit ・Intel が公開した高速なパケットIOを提供するライブラリ ・6WING が dpdk.org
を立ち上げ, 高性能化. Intel が dpdk.org が公式と認定. ・BSDライセンス. バージョンは最新が18.08, stableが18.02.2 ・公称、”Over 160Mpps” (64byte(ショート)パケットで約80Gbps 1024byteパケットで約1300Gbps)
DPDKの高速化のポイント ・メモリコピー → カーネルバイパス ・割り込み → ポーリング ・コンテキストスイッチ → コアを占有
・TLBミス → hugepagesの利用 ・キャッシュミス → 独自のメモリ管理機構
実は夏休み前に.. micropsのDPDK対応をやりました.
実は夏休み前に.. ethernetとarpは(とりあえず機能的には)動いていました. が ・パケットIOにメモリリークがあってすぐ死ぬ ・抽象化ってなんですか グローバルに全体のコンフィグを持ったデータ構造ドカン できてる部分も再実装し直す.
具体的にやったこと ethernet, arp, ip , icmp, udpの機能実装 実装はmicrops(https://github.com/pandax381/microps)の参照実装 リポジトリはこれ (https://github.com/kawaharasouta/k_lunetta)
処理の流れ NIC rx_pkt rx_ether rx_ip rx_arp send_rep rx_udp rx_icmp echo_rep
tx_ip API (ソケット) echo_rep tx_ether tx_pkt
スレッド設計 NIC rx_pkt rx_ether rx_ip rx_arp send_rep rx_udp rx_icmp echo_rep
tx_ip API (ソケット) echo_rep tx_ether tx_pkt
スレッド設計 メインスレッド on master(0)core (network app) プロトコル関数群 受信スレッド on 1core
launch API(ソケット)
各プロトコルの抽象化 いつも通り行き当たりばったりなコードの書き方をしていたら そのインタフェース情報 どこにおくつもりなの? えっと... なんか... グローバルにいる気がします...
ethernet が持つ情報 struct ether_port { uint16_t port_num; ethernet_addr mac_addr; };
struct ether_port ports[ETHER_PORT_MAX_NUM]; 物理層の情報(今回はDPDKしか選択肢がないので 実体を入れてる ethernetが持つべき情報 ethernetのインタフェーステーブルみたいなもの
IPが持つ情報 struct ip_interface { struct ether_port *port; uint32_t addr; ...
}; struct ip_interface interfaces[IP_INTERFACE_NUM]; ethernetのインタフェース情報のポインタを持つ. 具体的に中の情報を知っている必要はない. IPが持つべき情報 IPのインタフェーステーブル
より高度な抽象化 (ex. IP struct ip_interface { void *link_port; void *tx_funk(void
*link_port, ...); void *rx_funk(void *link_port, ...); ... } IPは, リンク層の情報をほぼ持ってい なくて良い. 起動時に各ポインタをIPに渡すだけで 良い.
デモ lunettaのUDPのAPIで実装したechoサーバ
None
今後の課題 機能面 ・IPフラグメンテーション ・arp_reply受信前のarp_request要求があった時のブロック ・なんかバグってるところ絶対あるよね... (arpはすでに一個存在 ・TCPまだ実装してない
今後の課題 高速化面 ・パケットIOのメモリリークを早く取り除かないと... ・ソケットの部分でメモリコピーを減らしたい ・ロックレスキューの利用 ・ハードウェアオフローディングの利用 ・RSS(Receive Side Scaling)の検討
まとめ ・僕はネットワークのことを全くわかっていなかった ・しかしこのインターンでネットワークの入門ができた気がする ・ただ手を動かしているだけではダメだということを実感し, 考えてコードを書くことを学べた