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
2.2k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
epollによるNetwork I/O in Goランタイム
21/11/24 Go Reject Con 2021にて発表
https://moneyforward.connpass.com/event/228698/
H.Saki
November 24, 2021
More Decks by H.Saki
See All by H.Saki
さきさん文庫の書籍ができるまで
sakiengineer
0
540
slog.Handlerのよくある実装ミス
sakiengineer
5
820
Goの格言”Errors are values”の本質を読み解く
sakiengineer
10
2.9k
どうしてもcgoから逃げられなくなったあなたに知ってほしいcgoの使い方入門
sakiengineer
1
3k
アプリ側のコードを書いていた人がLambdaに触れて気づいたこと
sakiengineer
0
1.7k
スケジューラから学ぶGoランタイム 〜code reading of runtime pkg〜
sakiengineer
13
5.2k
select文の内部実装見つけました
sakiengineer
1
820
Other Decks in Technology
See All in Technology
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
140
GitHub Copilot app最速の発信の裏側
tomokusaba
1
250
AIのReact習熟度を測る
uhyo
2
680
アラート調査向けAIエージェントの本番導入とその後/AI Agents for Alert Investigation: Production Deployment and After
taddy_919
0
120
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
180
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
190
自宅LLMの話
jacopen
1
720
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
190
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
4
770
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
180
脱SaaS!FDEを支えるプロビジョニングと分離設計
knih
0
300
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
540
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
160
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
230
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Technical Leadership for Architectural Decision Making
baasie
3
420
Tell your own story through comics
letsgokoyo
1
960
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
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