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
310
klab インターン成果物発表
khwarizmi
August 31, 2018
Tweet
Share
More Decks by khwarizmi
See All by khwarizmi
IntelNIC 送受信を学ぶ
khwarizmi
3
960
NICのデバドラ開発
khwarizmi
0
170
ハードウェア乱数を用いた謝辞代表者の決定
khwarizmi
0
91
僕はDPDKをやっている人ではありません(XDP・netmap入門)
khwarizmi
1
770
ネットワーク性能調査ちょっとやってみる
khwarizmi
0
220
Z4「高速なFW/IDSの実装」
khwarizmi
0
180
HIGHSPEED PACKET IO
khwarizmi
0
110
Other Decks in Programming
See All in Programming
5つのアンチパターンから学ぶLT設計
narihara
1
170
AI駆動のマルチエージェントによる業務フロー自動化の設計と実践
h_okkah
0
150
Agentic Coding: The Future of Software Development with Agents
mitsuhiko
0
100
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
160
Is Xcode slowly dying out in 2025?
uetyo
1
270
Quand Symfony, ApiPlatform, OpenAI et LangChain s'allient pour exploiter vos PDF : de la théorie à la production…
ahmedbhs123
0
190
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
770
#QiitaBash MCPのセキュリティ
ryosukedtomita
1
1.3k
Rails Frontend Evolution: It Was a Setup All Along
skryukov
0
140
Porting a visionOS App to Android XR
akkeylab
0
470
レベル1の開発生産性向上に取り組む − 日々の作業の効率化・自動化を通じた改善活動
kesoji
0
220
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
820
Featured
See All Featured
How to Ace a Technical Interview
jacobian
278
23k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Become a Pro
speakerdeck
PRO
29
5.4k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
How STYLIGHT went responsive
nonsquared
100
5.6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
How to train your dragon (web standard)
notwaldorf
95
6.1k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
A Tale of Four Properties
chriscoyier
160
23k
The Cult of Friendly URLs
andyhume
79
6.5k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
950
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)の検討
まとめ ・僕はネットワークのことを全くわかっていなかった ・しかしこのインターンでネットワークの入門ができた気がする ・ただ手を動かしているだけではダメだということを実感し, 考えてコードを書くことを学べた