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
epollによるNetwork I/O in Goランタイム
Search
H.Saki
November 24, 2021
Technology
3
2.1k
epollによるNetwork I/O in Goランタイム
21/11/24 Go Reject Con 2021にて発表
https://moneyforward.connpass.com/event/228698/
H.Saki
November 24, 2021
Tweet
Share
More Decks by H.Saki
See All by H.Saki
Goの格言”Errors are values”の本質を読み解く
sakiengineer
10
2.7k
どうしてもcgoから逃げられなくなったあなたに知ってほしいcgoの使い方入門
sakiengineer
1
2.6k
アプリ側のコードを書いていた人がLambdaに触れて気づいたこと
sakiengineer
0
1.6k
スケジューラから学ぶGoランタイム 〜code reading of runtime pkg〜
sakiengineer
12
4.9k
select文の内部実装見つけました
sakiengineer
1
760
Other Decks in Technology
See All in Technology
生まれ変わった AWS Security Hub (Preview) を紹介 #reInforce_osaka / reInforce New Security Hub
masahirokawahara
0
410
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
2
310
Frontier airlines®️ USA Contact Numbers: Complete 2025 Support Guide
oliversmith12
0
110
赤煉瓦倉庫勉強会「Databricksを選んだ理由と、絶賛真っ只中のデータ基盤移行体験記」
ivry_presentationmaterials
2
290
生成AI活用の組織格差を解消する 〜ビジネス職のCursor導入が開発効率に与えた好循環〜 / Closing the Organizational Gap in AI Adoption
upamune
6
5k
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 完全版 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming - Expanded
tomzoh
4
3.4k
LangChain Interrupt & LangChain Ambassadors meetingレポート
os1ma
2
270
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
2
7.7k
敢えて生成AIを使わないマネジメント業務
kzkmaeda
1
240
Yamla: Rustでつくるリアルタイム性を追求した機械学習基盤 / Yamla: A Rust-Based Machine Learning Platform Pursuing Real-Time Capabilities
lycorptech_jp
PRO
4
220
20250705 Headlamp: 專注可擴展性的 Kubernetes 用戶界面
pichuang
0
190
無意味な開発生産性の議論から抜け出すための予兆検知とお金とAI
i35_267
3
11k
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Gamification - CAS2011
davidbonilla
81
5.3k
Statistics for Hackers
jakevdp
799
220k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
A designer walks into a library…
pauljervisheath
207
24k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Music & Morning Musume
bryan
46
6.6k
Docker and Python
trallard
44
3.5k
Writing Fast Ruby
sferik
628
62k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
スケジューラから学ぶGoランタイム 〜 code reading of runtime pkg〜 epollによるNetwork I/O in
Goランタイム さき(H.Saki) @saki-engineer Go Conference 2021 Autumn, NOV 13 2021 Go Reject Con, NOV 24 2021
自己紹介 About Me l ͖͞ )4BLJ ◦ ౦େֶ෦ ˠ ࠓ͔Β৽ࣾձਓ
◦ 5XJUUFS!TBLJFOHJOFFS l աڈͷՌ FUDʜ
Go Conference 2021 Autumn ʮεέδϡʔϥ͔ΒֶͿ(PϥϯλΠϜʯͱ͍͏λΠτϧͰొஃ͖ͯ͠·ͨ͠ɻ
ຊηογϣϯͷ·ͱΊ
1章 ランタイムとは l (PϥϯλΠϜϓϩάϥϜΛಈ͔͢ͷʹඞཁͳࡉʑͱͨ͠ॲཧΛɺਓͷΘ ΓʹҾ͖ड͚ͯ͘ΕΔՕॴ ϝϞϦͷׂΓͯ intܕͭΛ֨ೲ͢ΔϝϞϦ ࣗಈͰ֬อ͞ΕΔ $ݴޠͩͱmallocͳͲͰ ໌ࣔతʹ֬อ͢Δඞཁ͋Γ
(PϥϯλΠϜͷׂ ΨϕʔδίϨΫτ εέδϡʔϦϯά ͍ऴΘͬͨมarrayͷ ϝϞϦղ์ࣗಈͰߦΘΕΔ $ݴޠͩͱfreeͰ ໌ࣔతʹղ์͢Δඞཁ͋Γ ฒߦͳؔΛ࣮ࡍʹͲͷλΠ ϛϯάͰಈ͔͢ͷ͔ࣗಈͰ ௐ͞ΕΔ
2章 Goランタイムのコンポーネント l (PϥϯλΠϜʹͭͷίϯϙʔωϯτ͕͋Γ·͢ɻ ׂ ΰʔϧʔνϯ ( . 1 04εϨου
࣮ߦϦιʔεɺԾ$16 ུশ ׂ ϥϯλΠϜશମͷঢ়ଶཧ TDIFE TZTNPO ( γεςϜϞχλ εέδϡʔϥͷ࣮ଶ ུশ ( . 1 ( ( ( . TZTNPO ( (
3章 スケジューリングとプリエンプション l εέδϡʔϦϯά(ͱ.Λͭͳ͛Δ l ϓϦΤϯϓγϣϯ(ͱ.ΛΓ͢ l ͲͪΒ(PϥϯλΠϜ͕ߦ͏ػೳͰ͢ γεςϜίʔϧͷݺͼग़͠ (
. 1ૢ࡞ͷ۩ମྫ ϓϦΤϯϓγϣϯ εέδϡʔϦϯά 1 . ( ( ( . 1 . ( ( ( 1 . ( ( (
4章 ランタイムが絡む処理 l ( . 1ͷΓ͢ɾͭͳ͛Δ࡞ۀɺϓϩάϥϜ࣮ߦޮΛ্͛ΔͨΊʹߦ ΘΕΔ͜ͱ͕͋Δ l ͜ͷૢ࡞ʹ(PϥϯλΠϜ͕ີʹབྷΜͰ͍Δ γεςϜίʔϧͷݺͼग़͠
( . 1ૢ࡞ͷ۩ମྫ ϓϦΤϯϓγϣϯ εέδϡʔϦϯά 1 . ( ( ( . 1 . ( ( ( 1 . ( ( (
アジェンダ ϥϯλΠϜͱ ʜʜϥϯλΠϜͬͯԿʁ (PϥϯλΠϜͷίϯϙʔωϯτ ʜʜϥϯλΠϜͬͯͲΜͳ෦Ͱग़དྷ͍ͯΔͷʁ εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ ʜʜϥϯλΠϜʹ͜ͷΑ͏ͳػೳ͕͋Γ·͢
ϥϯλΠϜ͕བྷΉॲཧ ʜʜϥϯλΠϜͷػೳ͜ͷΑ͏ͳॴ Ϣʔεέʔε ͰΘΕ·͢ ϥϯλΠϜΛֶͿʹ
アジェンダ ϥϯλΠϜͱ (PϥϯλΠϜͷίϯϙʔωϯτ εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ ϥϯλΠϜ͕བྷΉॲཧ
ϥϯλΠϜΛֶͿʹ
実行可能なGを探索(7/9) 〜 ネットワークI/O待ちの確認 3. スケジューリングとプリエンプション ͦͷ࣍ʹɺOFUQPMMʹͯʮ*0͕ͪऴΘ࣮ͬͯߦՄೳʹͳͬͨ(ʯ͕ͳ͍͔Ͳ͏ ͔ΛνΣοΫ͠·͢ɻ 1 . (
ۭ FQPMM Πϯ ελ ϯε *0ऴΘͬͨ(͕ͳ͍͔ ͍߹Θͤ ग़యSVOUJNFQSPDHP
実行可能なGを探索(7/9) 〜 ネットワークI/O待ちの確認 3. スケジューリングとプリエンプション . ( FQPMM Πϯ
ελ ϯε ͜Εɺ୭ʁʁʁʁ
8IBUJTlFQPMMz
LinuxにおけるI/O 4. ランタイムが絡む処理 -JOVYͰɺϑΝΠϧωοτϫʔΫιέοτͳͲ*0ͷରͱͳΔͷΛɺ ʮϑΝΠϧσΟεΫϦϓλ GE ʯͱ͍͏൪߸Ͱཧ͍ͯ͠·͢ɻ ϑΝΠϧ ඪ४ೖྗ ωοτϫʔΫ
ιέοτ ϑΝΠϧGE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ
LinuxにおけるI/O 4. ランタイムが絡む処理 *0Λ࣮ߦ͍ͨ͠ϓϩηεɺରͱͳΔϑΝΠϧσΟεΫϦϓλʹରͯ͠SFBE XSJUFͱ͍ͬͨγεςϜίʔϧΛൃߦ͠·͢ɻ ϑΝΠϧ ඪ४ೖྗ ωοτϫʔΫ ιέοτ ϓϩηε
XSJUF SFBE ϑΝΠϧGE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ
Linuxにおける多重I/O 4. ランタイムが絡む処理 ͔͜͜ΒɺʮͭͷωοτϫʔΫͷ͏ͪͲͪΒ͔͔Βͷड৴݁ՌΛɺϑΝΠϧ ʹॻ͖ࠐΉʯͱ͍͏ॲཧΛߟ͑·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε XSJUF
SFBE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ SFBE ωοτϫʔΫ ιέοτ
LinuxにおけるI/O 〜 blocking I/O 4. ランタイムが絡む処理 ෳѻ͍ͬͯΔ͏ͪͷͭͷGEͰͷ*0͕ϒϩοΫঢ়ଶʹͳΔͱɺͦͷ*0Λ࣮ߦ ͍ͯ͠ΔϓϩηεTMFFQঢ়ଶʹͳͬͯ͠·͍·͢ɻ ϑΝΠϧ ωοτϫʔΫ
ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ SFBE ˠಡΈऔΓͷ४උ͕Ͱ͖ͯ ͍ͳ͍ͷͰϒϩοΫ ωοτϫʔΫ ιέοτ
LinuxにおけるI/O 〜 blocking I/O 4. ランタイムが絡む処理 ϓϩηε͕TMFFQঢ়ଶʹͳͬͯ͠·͏ͱɺͦͷؒʹଞͷૢ࡞͕ҰͰ͖ͳ͘ͳΔ ͷͰޮ͕ѱ͍Ͱ͢ɻ ϑΝΠϧ ωοτϫʔΫ
ιέοτ ϓϩηε TMFFQ XSJUF SFBE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ ϒϩοΫ͞Ε͍ͯΔ*0͕࣮ߦ͞ΕΔ ·Ͱɺଞͷૢ࡞͕Ͱ͖ͳ͍
LinuxにおけるI/O 〜 non-blocking I/O 4. ランタイムが絡む処理 ϒϩοΫΛ͙ͨΊʹɺʮ*0ͷ४උ͕Ͱ͖͍ͯͳ͍ͳΒɺΤϥʔΛฦ͢ʯͱ͍ ͏OPOCMPDLJOHϞʔυͰͷ*0ߦ͏͜ͱ͕Ͱ͖·͢ɻ ϑΝΠϧ ωοτϫʔΫ
ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ SFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍
LinuxにおけるI/O 〜 non-blocking I/O 4. ランタイムが絡む処理 ϒϩοΫΛ͙ͨΊʹɺʮ*0ͷ४උ͕Ͱ͖͍ͯͳ͍ͳΒɺΤϥʔΛฦ͢ʯͱ͍ ͏OPOCMPDLJOHϞʔυͰͷ*0ߦ͏͜ͱ͕Ͱ͖·͢ɻ ϑΝΠϧ ωοτϫʔΫ
ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ SFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍ ˠΤϥʔΛฦ͢ ωοτϫʔΫ ιέοτ
多重I/Oの面倒さ 4. ランタイムが絡む処理 ͨͩɺॴͷૢ࡞Λ͢ΔͨΊʹɺదͳॱ൪ͰOPOCMPDLJOH*0ΛࣗྗͰൃߦ ͠ଓ͚Δͷ໘Ͱ͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE
ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ OPOCMPDLJOHͳSFBEཁٻΛ ޭ͢Δ·Ͱߦ͏ ಡΈࠐΜͩ༰ΛXSJUF͢Δ
epoll 4. ランタイムが絡む処理 ͦ͜Ͱɺ-JOVYͰෳͷ*0ΛޮΑ͘ཧ͢ΔͨΊͷΈzFQPMMzͱ͍͏ ͷ͕͋Γ·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE
ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ FQPMM Πϯ ελ ϯε ཧɾࢹ *0ͷ४උ͕Ͱ͖ͨ GE͕ͳ͍͔֬ೝ
epoll 4. ランタイムが絡む処理 SVOUJNFύοέʔδʹɺFQPMMΠϯελϯεͷGEΛอଘ͢ΔͨΊͷάϩʔό ϧมFQGE͕͋Γ·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP
epoll 4. ランタイムが絡む処理 FQPMMΠϯελϯε͕ඞཁʹͳͬͨஈ֊ͰɺFQPMMDSFBUFؔʹΑͬͯॳظԽ͞ Ε·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP
ॳظԽ
ネットワークI/O 4. ランタイムが絡む処理 -JOVYͰɺωοτϫʔΫ*0FQPMMΠϯελϯεܦ༝ͰߦΘΕΔɻ ϑΝΠϧͷొ SVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ *0ͷ֬ೝ FQPMM
Πϯ ελ ϯε *0ͷ༗ແΛࢹ͍ͨ͠ϑΝΠϧGEΛ FQPMMΠϯελϯεʹొ͢Δ ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@DUMͰ ొ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@XBJUͰ ߹ͤ
epoll 4. ランタイムが絡む処理 OFU%JBMؔʹΑͬͯίωΫγϣϯ0QFO͢ΔͱɺFQPMMDUM͕ؔ࠷ऴతʹݺΕɺ FQPMMΠϯελϯεʹΑͬͯͦͷDPOO͕ѻ͑ΔΑ͏ʹͳΓ·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP
୧͍ͬͯ͘ͱʜʜ ωοτϫʔΫ ιέοτ ϑΝΠϧGE ࢹରͱͯ͠ ొ
epoll 4. ランタイムが絡む処理 OFU%JBMؔˠFQPMMDUMؔ·Ͱͷಓےͱ͍ͯͰ͢ɻ ڵຯ͕͋ΔํɺҎԼͷ;FOOॻ੶ͷষΛ͝ཡ͍ͩ͘͞ɻ JOষ (PϥϯλΠϜέʔεελσΟ એԵXXX
ネットワークI/O 4. ランタイムが絡む処理 -JOVYͰɺωοτϫʔΫ*0FQPMMΠϯελϯεܦ༝ͰߦΘΕΔɻ ϑΝΠϧͷొ SVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ *0ͷ֬ೝ FQPMM
Πϯ ελ ϯε *0ͷ༗ແΛࢹ͍ͨ͠ϑΝΠϧGEΛ FQPMMΠϯελϯεʹొ͢Δ ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@DUMͰ ొ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@XBJUͰ ߹ͤ
ネットワークI/O 4. ランタイムが絡む処理 ग़యSVOUJNFQSPDHP . TZTNPO ( *0ऴΘΓͷ(͕ͳ͍͔ ߹ͤ FQPMM
Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE TZTNPOͷதͰɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ
ネットワークI/O network I/O OFUQPMMؔͷதͰɺ·͞ʹFQPMM@XBJUͷଘࡏ͕֬ೝͰ͖Δɻ FQPMM Πϯ ελ ϯε *0Ͱ͖ΔGE͕ͳ͍͔ ֬ೝ
ϓϩηε ग़యSVOUJNFOFUQPMM@FQPMMHP
ネットワークI/O 4. ランタイムが絡む処理 . TZTNPO ( *0ऴΘΓͷ(͕ͳ͍͔ ߹ͤ FQPMM Πϯ
ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE TZTNPOͷதͰɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ ( *0ऴΘΓͷ(ΛHFU
ネットワークI/O 4. ランタイムが絡む処理 . TZTNPO ( TZTNPOͷதͰɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ ( TDIFE
SVOR ( ( ( HFUͨ͠(Λ άϩʔόϧΩϡʔʹೖΕΔ
まとめ l FQPMMɺଟॏ*0ΛޮΑ͘ߦ͏ͨΊͷ-JOVYͷػೳͰ͢ l FQPMMͰॏཁͳͷҎԼͭͰ͢ ◦ FQPMM@DSFBUFFQPMMΠϯελϯεΛ࡞Δ ◦ FQPMM@DUMGEΛFQPMMΠϯελϯεʹΑΔࢹରʹొ ◦
FQPMM@XBJU*0࣮ߦՄೳͳGE͕ͳ͍͔ɺFQPMMΠϯελϯεʹ֬ೝ l (PϥϯλΠϜͰɺFQPMMͷػೳ͕ଘʹར༻͞Ε͍ͯ·͢
epollについて詳しく知りたい方はこちら ΦϥΠϦʔͷz-JOVY4ZTUFN1SPHSBNNJOH OE&EJUJPOz • $IBQUFS 'JMF*0 • $IBQUFS
"EWBODFE'JMF*0 Ҏ্ষʹɺ-JOVYʹ͓͚Δ*0͕ৄ͘͠৮ΕΒΕ͍ͯ·͢
5IBOLZPVGPSMJTUFOJOH