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.6k
どうしてもcgoから逃げられなくなったあなたに知ってほしいcgoの使い方入門
sakiengineer
1
2.5k
アプリ側のコードを書いていた人がLambdaに触れて気づいたこと
sakiengineer
0
1.6k
スケジューラから学ぶGoランタイム 〜code reading of runtime pkg〜
sakiengineer
12
4.8k
select文の内部実装見つけました
sakiengineer
1
750
Other Decks in Technology
See All in Technology
Winning at PHP in Production in 2025
beberlei
1
280
GraphQLを活用したリアーキテクチャに対応するSLI/Oの再設計
coconala_engineer
0
210
Global Azure2025(GitHub Copilot ハンズオン)
tomokusaba
2
720
Datadog のトライアルを成功に導く技術 / Techniques for a successful Datadog trial
nulabinc
PRO
0
130
大規模サーバーレスプロジェクトのリアルな零れ話
maimyyym
3
210
AI-in-the-Enterprise|OpenAIが公開した「AI導入7つの教訓」——ChatGPTで変わる企業の未来とは?
customercloud
PRO
0
160
Azure Maps Visual in PowerBIで分析しよう
nakasho
0
210
雑に疎通確認だけしたい...せや!CloudShell使ったろ!
alchemy1115
0
210
MySQL Indexes and Histograms – How they really speed up your queries
lefred
0
160
AI 코딩 에이전트 더 똑똑하게 쓰기
nacyot
0
540
RubyKaigi NOC 近況 2025
sorah
1
740
Part1 GitHubってなんだろう?その1
tomokusaba
3
740
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.5k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Scaling GitHub
holman
459
140k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
47
2.7k
Building Adaptive Systems
keathley
41
2.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
Automating Front-end Workflow
addyosmani
1370
200k
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