21/11/24 Go Reject Con 2021にて発表 https://moneyforward.connpass.com/event/228698/
スケジューラから学ぶGoランタイム〜 code reading of runtime pkg〜epollによるNetwork I/O in Goランタイムさき(H.Saki)@saki-engineerGo Conference 2021 Autumn, NOV 13 2021Go Reject Con, NOV 24 2021
View Slide
自己紹介About Mel ͖͞ )4BLJ○ ౦େֶ෦ ˠ ࠓ͔Β৽ࣾձਓ○ 5XJUUFS!TBLJFOHJOFFSl աڈͷՌFUDʜ
Go Conference 2021 Autumnʮεέδϡʔϥ͔ΒֶͿ(PϥϯλΠϜʯͱ͍͏λΠτϧͰొஃ͖ͯ͠·ͨ͠ɻ
ຊηογϣϯͷ·ͱΊ
1章 ランタイムとはl (PϥϯλΠϜϓϩάϥϜΛಈ͔͢ͷʹඞཁͳࡉʑͱͨ͠ॲཧΛɺਓͷΘΓʹҾ͖ड͚ͯ͘ΕΔՕॴϝϞϦͷׂΓͯintܕͭΛ֨ೲ͢ΔϝϞϦࣗಈͰ֬อ͞ΕΔ$ݴޠͩͱmallocͳͲͰ໌ࣔతʹ֬อ͢Δඞཁ͋Γ(PϥϯλΠϜͷׂΨϕʔδίϨΫτ εέδϡʔϦϯά͍ऴΘͬͨมarrayͷϝϞϦղ์ࣗಈͰߦΘΕΔ$ݴޠͩͱfreeͰ໌ࣔతʹղ์͢Δඞཁ͋ΓฒߦͳؔΛ࣮ࡍʹͲͷλΠϛϯάͰಈ͔͢ͷ͔ࣗಈͰௐ͞ΕΔ
2章 Goランタイムのコンポーネントl (PϥϯλΠϜʹͭͷίϯϙʔωϯτ͕͋Γ·͢ɻׂΰʔϧʔνϯ(.104εϨου࣮ߦϦιʔεɺԾ$16ུশ ׂϥϯλΠϜશମͷঢ়ଶཧTDIFETZTNPO(γεςϜϞχλεέδϡʔϥͷ࣮ଶུশ(.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/O4. ランタイムが絡む処理-JOVYͰɺϑΝΠϧωοτϫʔΫιέοτͳͲ*0ͷରͱͳΔͷΛɺʮϑΝΠϧσΟεΫϦϓλ GEʯͱ͍͏൪߸Ͱཧ͍ͯ͠·͢ɻϑΝΠϧඪ४ೖྗωοτϫʔΫιέοτϑΝΠϧGEϑΝΠϧGE ྫϑΝΠϧGE ྫ
LinuxにおけるI/O4. ランタイムが絡む処理*0Λ࣮ߦ͍ͨ͠ϓϩηεɺରͱͳΔϑΝΠϧσΟεΫϦϓλʹରͯ͠SFBEXSJUFͱ͍ͬͨγεςϜίʔϧΛൃߦ͠·͢ɻϑΝΠϧඪ४ೖྗωοτϫʔΫιέοτϓϩηεXSJUF SFBE ϑΝΠϧGEϑΝΠϧGE ྫϑΝΠϧGE ྫ
Linuxにおける多重I/O4. ランタイムが絡む処理͔͜͜ΒɺʮͭͷωοτϫʔΫͷ͏ͪͲͪΒ͔͔Βͷड৴݁ՌΛɺϑΝΠϧʹॻ͖ࠐΉʯͱ͍͏ॲཧΛߟ͑·͢ɻϑΝΠϧωοτϫʔΫιέοτϓϩηεXSJUF SFBE ϑΝΠϧGE ྫϑΝΠϧGE ྫϑΝΠϧGE ྫSFBE ωοτϫʔΫιέοτ
LinuxにおけるI/O 〜 blocking I/O4. ランタイムが絡む処理ෳѻ͍ͬͯΔ͏ͪͷͭͷGEͰͷ*0͕ϒϩοΫঢ়ଶʹͳΔͱɺͦͷ*0Λ࣮ߦ͍ͯ͠ΔϓϩηεTMFFQঢ়ଶʹͳͬͯ͠·͍·͢ɻϑΝΠϧωοτϫʔΫιέοτϓϩηεϑΝΠϧGE ྫϑΝΠϧGE ྫϑΝΠϧGE ྫSFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍ͷͰϒϩοΫ ωοτϫʔΫιέοτ
LinuxにおけるI/O 〜 blocking I/O4. ランタイムが絡む処理ϓϩηε͕TMFFQঢ়ଶʹͳͬͯ͠·͏ͱɺͦͷؒʹଞͷૢ࡞͕ҰͰ͖ͳ͘ͳΔͷͰޮ͕ѱ͍Ͱ͢ɻϑΝΠϧωοτϫʔΫιέοτϓϩηεTMFFQXSJUF SFBE ϑΝΠϧGE ྫϑΝΠϧGE ྫϑΝΠϧGE ྫωοτϫʔΫιέοτϒϩοΫ͞Ε͍ͯΔ*0͕࣮ߦ͞ΕΔ·Ͱɺଞͷૢ࡞͕Ͱ͖ͳ͍
LinuxにおけるI/O 〜 non-blocking I/O4. ランタイムが絡む処理ϒϩοΫΛ͙ͨΊʹɺʮ*0ͷ४උ͕Ͱ͖͍ͯͳ͍ͳΒɺΤϥʔΛฦ͢ʯͱ͍͏OPOCMPDLJOHϞʔυͰͷ*0ߦ͏͜ͱ͕Ͱ͖·͢ɻϑΝΠϧωοτϫʔΫιέοτϓϩηεϑΝΠϧGE ྫϑΝΠϧGE ྫϑΝΠϧGE ྫωοτϫʔΫιέοτSFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍
LinuxにおけるI/O 〜 non-blocking I/O4. ランタイムが絡む処理ϒϩοΫΛ͙ͨΊʹɺʮ*0ͷ४උ͕Ͱ͖͍ͯͳ͍ͳΒɺΤϥʔΛฦ͢ʯͱ͍͏OPOCMPDLJOHϞʔυͰͷ*0ߦ͏͜ͱ͕Ͱ͖·͢ɻϑΝΠϧωοτϫʔΫιέοτϓϩηεϑΝΠϧGE ྫϑΝΠϧGE ྫϑΝΠϧGE ྫSFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍ˠΤϥʔΛฦ͢ωοτϫʔΫιέοτ
多重I/Oの面倒さ4. ランタイムが絡む処理ͨͩɺॴͷૢ࡞Λ͢ΔͨΊʹɺదͳॱ൪ͰOPOCMPDLJOH*0ΛࣗྗͰൃߦ͠ଓ͚Δͷ໘Ͱ͢ɻϑΝΠϧωοτϫʔΫιέοτϓϩηεϑΝΠϧGE ྫϑΝΠϧGE ྫϑΝΠϧGE ྫωοτϫʔΫιέοτOPOCMPDLJOHͳSFBEཁٻΛޭ͢Δ·Ͱߦ͏ಡΈࠐΜͩ༰ΛXSJUF͢Δ
epoll4. ランタイムが絡む処理ͦ͜Ͱɺ-JOVYͰෳͷ*0ΛޮΑ͘ཧ͢ΔͨΊͷΈzFQPMMzͱ͍͏ͷ͕͋Γ·͢ɻϑΝΠϧωοτϫʔΫιέοτϓϩηεϑΝΠϧGE ྫϑΝΠϧGE ྫϑΝΠϧGE ྫωοτϫʔΫιέοτFQPMMΠϯελϯεཧɾࢹ*0ͷ४උ͕Ͱ͖ͨGE͕ͳ͍͔֬ೝ
epoll4. ランタイムが絡む処理SVOUJNFύοέʔδʹɺFQPMMΠϯελϯεͷGEΛอଘ͢ΔͨΊͷάϩʔόϧมFQGE͕͋Γ·͢ɻFQPMMΠϯελϯεग़య[email protected]
epoll4. ランタイムが絡む処理FQPMMΠϯελϯε͕ඞཁʹͳͬͨஈ֊ͰɺFQPMMDSFBUFؔʹΑͬͯॳظԽ͞Ε·͢ɻFQPMMΠϯελϯεग़య[email protected]ॳظԽ
ネットワークI/O4. ランタイムが絡む処理-JOVYͰɺωοτϫʔΫ*0FQPMMΠϯελϯεܦ༝ͰߦΘΕΔɻϑΝΠϧͷొSVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ*0ͷ֬ೝFQPMMΠϯελϯε*0ͷ༗ແΛࢹ͍ͨ͠ϑΝΠϧGEΛFQPMMΠϯελϯεʹొ͢ΔϑΝΠϧGEϑΝΠϧGE[email protected]ͰొFQPMMΠϯελϯεϑΝΠϧGEϑΝΠϧGE[email protected]Ͱ߹ͤ
epoll4. ランタイムが絡む処理OFU%JBMؔʹΑͬͯίωΫγϣϯ0QFO͢ΔͱɺFQPMMDUM͕ؔ࠷ऴతʹݺΕɺFQPMMΠϯελϯεʹΑͬͯͦͷDPOO͕ѻ͑ΔΑ͏ʹͳΓ·͢ɻFQPMMΠϯελϯεग़య[email protected]୧͍ͬͯ͘ͱʜʜωοτϫʔΫιέοτϑΝΠϧGEࢹରͱͯ͠ొ
epoll4. ランタイムが絡む処理OFU%JBMؔˠFQPMMDUMؔ·Ͱͷಓےͱ͍ͯͰ͢ɻڵຯ͕͋ΔํɺҎԼͷ;FOOॻ੶ͷষΛ͝ཡ͍ͩ͘͞ɻJOষ(PϥϯλΠϜέʔεελσΟએԵXXX
ネットワークI/O4. ランタイムが絡む処理ग़యSVOUJNFQSPDHP.TZTNPO(*0ऴΘΓͷ(͕ͳ͍͔߹ͤFQPMMΠϯελϯεϑΝΠϧGEϑΝΠϧGETZTNPOͷதͰɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹೖΕΔ࡞ۀΛ͍ͯ͠Δɻ
ネットワークI/Onetwork I/OOFUQPMMؔͷதͰɺ·͞ʹ[email protected]ͷଘࡏ͕֬ೝͰ͖ΔɻFQPMMΠϯελϯε*0Ͱ͖ΔGE͕ͳ͍͔֬ೝϓϩηεग़య[email protected]
ネットワークI/O4. ランタイムが絡む処理.TZTNPO(*0ऴΘΓͷ(͕ͳ͍͔߹ͤFQPMMΠϯελϯεϑΝΠϧGEϑΝΠϧGETZTNPOͷதͰɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹೖΕΔ࡞ۀΛ͍ͯ͠Δɻ(*0ऴΘΓͷ(ΛHFU
ネットワークI/O4. ランタイムが絡む処理.TZTNPO(TZTNPOͷதͰɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹೖΕΔ࡞ۀΛ͍ͯ͠Δɻ(TDIFE SVOR ( ( (HFUͨ͠(ΛάϩʔόϧΩϡʔʹೖΕΔ
まとめl FQPMMɺଟॏ*0ΛޮΑ͘ߦ͏ͨΊͷ-JOVYͷػೳͰ͢l FQPMMͰॏཁͳͷҎԼͭͰ͢○ [email protected]ΠϯελϯεΛ࡞Δ○ [email protected]ΛFQPMMΠϯελϯεʹΑΔࢹରʹొ○ [email protected]*0࣮ߦՄೳͳGE͕ͳ͍͔ɺFQPMMΠϯελϯεʹ֬ೝl (PϥϯλΠϜͰɺFQPMMͷػೳ͕ଘʹར༻͞Ε͍ͯ·͢
epollについて詳しく知りたい方はこちらΦϥΠϦʔͷz-JOVY4ZTUFN1SPHSBNNJOH OE&EJUJPOz• $IBQUFS 'JMF*0• $IBQUFS "EWBODFE'JMF*0Ҏ্ষʹɺ-JOVYʹ͓͚Δ*0͕ৄ͘͠৮ΕΒΕ͍ͯ·͢
5IBOLZPVGPSMJTUFOJOH