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
410
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
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
0
100
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
4
1k
MCP Appsを作ってみよう
iwamot
PRO
4
660
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.1k
Claude Codeとのおしゃべりでセマンティックモデルの定義からダッシュボード作成まで完成させる
nic_sugiyama
0
120
iAEONの段階的リアーキテクト戦略 / iAEON's_Gradual_Re-architecture_Strategy
aeonpeople
0
110
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
2
360
失敗を資産に変えるClaude Code
shinyasaita
0
670
やさしいA2A入門
minorun365
PRO
12
1.9k
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
1.1k
プロダクト開発から業務改善コンサルまで。事業全体へ「染み出す」ことで広がるエンジニアの可能性
ham0215
0
130
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
140
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
WCS-LA-2024
lcolladotor
0
630
A Modern Web Designer's Workflow
chriscoyier
698
190k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Statistics for Hackers
jakevdp
799
230k
Navigating Weather and Climate Data
rabernat
0
220
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Pragmatic Product Professional
lauravandoore
37
7.3k
We Have a Design System, Now What?
morganepeng
55
8.2k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
230
Exploring anti-patterns in Rails
aemeredith
3
410
What's in a price? How to price your products and services
michaelherold
247
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