Slide 1

Slide 1 text

スケジューラから学ぶ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

Slide 2

Slide 2 text

自己紹介 About Me l ͖͞ )4BLJ ○ ౦େ޻ֶ෦ ˠ ࠓ೥͔Β৽ࣾձਓ ○ 5XJUUFS!TBLJFOHJOFFS l աڈͷ੒Ռ෺ FUDʜ

Slide 3

Slide 3 text

Go Conference 2021 Autumn ʮεέδϡʔϥ͔ΒֶͿ(PϥϯλΠϜʯͱ͍͏λΠτϧͰొஃ͖ͯ͠·ͨ͠ɻ

Slide 4

Slide 4 text

ຊηογϣϯͷ·ͱΊ

Slide 5

Slide 5 text

1章 ランタイムとは l (PϥϯλΠϜϓϩάϥϜΛಈ͔͢ͷʹඞཁͳࡉʑͱͨ͠ॲཧΛɺਓͷ୅Θ ΓʹҾ͖ड͚ͯ͘ΕΔՕॴ ϝϞϦͷׂΓ౰ͯ intܕͭΛ֨ೲ͢ΔϝϞϦ͸ ࣗಈͰ֬อ͞ΕΔ ஫$ݴޠͩͱmallocͳͲͰ ໌ࣔతʹ֬อ͢Δඞཁ͋Γ (PϥϯλΠϜͷ໾ׂ ΨϕʔδίϨΫτ εέδϡʔϦϯά ࢖͍ऴΘͬͨม਺arrayͷ ϝϞϦղ์͸ࣗಈͰߦΘΕΔ ஫$ݴޠͩͱfreeͰ ໌ࣔతʹղ์͢Δඞཁ͋Γ ฒߦͳؔ਺Λ࣮ࡍʹͲͷλΠ ϛϯάͰಈ͔͢ͷ͔͸ࣗಈͰ ௐ੔͞ΕΔ

Slide 6

Slide 6 text

2章 Goランタイムのコンポーネント l (PϥϯλΠϜʹ͸ͭͷίϯϙʔωϯτ͕͋Γ·͢ɻ ໾ׂ ΰʔϧʔνϯ ( . 1 04εϨου ࣮ߦϦιʔεɺԾ૝$16 ུশ ໾ׂ ϥϯλΠϜશମͷঢ়ଶ؅ཧ TDIFE TZTNPO ( γεςϜϞχλ εέδϡʔϥͷ࣮ଶ ུশ ( . 1 ( ( ( . TZTNPO ( (

Slide 7

Slide 7 text

3章 スケジューリングとプリエンプション l εέδϡʔϦϯά(ͱ.Λͭͳ͛Δ l ϓϦΤϯϓγϣϯ(ͱ.Λ੾Γ཭͢ l ͲͪΒ΋(PϥϯλΠϜ͕ߦ͏ػೳͰ͢ γεςϜίʔϧͷݺͼग़͠ ( . 1ૢ࡞ͷ۩ମྫ ϓϦΤϯϓγϣϯ εέδϡʔϦϯά 1 . ( ( ( . 1 . ( ( ( 1 . ( ( (

Slide 8

Slide 8 text

4章 ランタイムが絡む処理 l ( . 1ͷ੾Γ཭͢ɾͭͳ͛Δ࡞ۀ͸ɺϓϩάϥϜ࣮ߦޮ཰Λ্͛ΔͨΊʹߦ ΘΕΔ͜ͱ͕͋Δ l ͜ͷૢ࡞ʹ͸(PϥϯλΠϜ͕ີ઀ʹབྷΜͰ͍Δ γεςϜίʔϧͷݺͼग़͠ ( . 1ૢ࡞ͷ۩ମྫ ϓϦΤϯϓγϣϯ εέδϡʔϦϯά 1 . ( ( ( . 1 . ( ( ( 1 . ( ( (

Slide 9

Slide 9 text

アジェンダ ϥϯλΠϜͱ͸ ʜʜϥϯλΠϜͬͯԿʁ (PϥϯλΠϜͷίϯϙʔωϯτ ʜʜϥϯλΠϜͬͯͲΜͳ෦඼Ͱग़དྷ͍ͯΔͷʁ εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ ʜʜϥϯλΠϜʹ͸͜ͷΑ͏ͳػೳ͕͋Γ·͢ ϥϯλΠϜ͕བྷΉॲཧ ʜʜϥϯλΠϜͷػೳ͸͜ͷΑ͏ͳ৔ॴ Ϣʔεέʔε Ͱ࢖ΘΕ·͢ ϥϯλΠϜΛֶͿʹ͸

Slide 10

Slide 10 text

アジェンダ ϥϯλΠϜͱ͸ (PϥϯλΠϜͷίϯϙʔωϯτ εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ ϥϯλΠϜ͕བྷΉॲཧ ϥϯλΠϜΛֶͿʹ͸

Slide 11

Slide 11 text

実行可能なGを探索(7/9) 〜 ネットワークI/O待ちの確認 3. スケジューリングとプリエンプション ͦͷ࣍ʹɺOFUQPMMʹͯʮ*0଴͕ͪऴΘ࣮ͬͯߦՄೳʹͳͬͨ(ʯ͕ͳ͍͔Ͳ͏ ͔ΛνΣοΫ͠·͢ɻ 1 . ( ۭ FQPMM Πϯ ελ ϯε *0ऴΘͬͨ(͕ͳ͍͔ ໰͍߹Θͤ ग़యSVOUJNFQSPDHP

Slide 12

Slide 12 text

実行可能なGを探索(7/9) 〜 ネットワークI/O待ちの確認 3. スケジューリングとプリエンプション . ( FQPMM Πϯ ελ ϯε ͜Εɺ୭ʁʁʁʁ

Slide 13

Slide 13 text

8IBUJTlFQPMMz

Slide 14

Slide 14 text

LinuxにおけるI/O 4. ランタイムが絡む処理 -JOVYͰ͸ɺϑΝΠϧ΍ωοτϫʔΫιέοτͳͲ*0ͷର৅ͱͳΔ΋ͷΛɺ ʮϑΝΠϧσΟεΫϦϓλ GE ʯͱ͍͏൪߸Ͱ؅ཧ͍ͯ͠·͢ɻ ϑΝΠϧ ඪ४ೖྗ ωοτϫʔΫ ιέοτ ϑΝΠϧGE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ

Slide 15

Slide 15 text

LinuxにおけるI/O 4. ランタイムが絡む処理 *0Λ࣮ߦ͍ͨ͠ϓϩηε͸ɺର৅ͱͳΔϑΝΠϧσΟεΫϦϓλʹରͯ͠SFBE ΍XSJUFͱ͍ͬͨγεςϜίʔϧΛൃߦ͠·͢ɻ ϑΝΠϧ ඪ४ೖྗ ωοτϫʔΫ ιέοτ ϓϩηε XSJUF SFBE ϑΝΠϧGE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ

Slide 16

Slide 16 text

Linuxにおける多重I/O 4. ランタイムが絡む処理 ͔͜͜Β͸ɺʮͭͷωοτϫʔΫͷ͏ͪͲͪΒ͔͔Βͷड৴݁ՌΛɺϑΝΠϧ ʹॻ͖ࠐΉʯͱ͍͏ॲཧΛߟ͑·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε XSJUF SFBE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ SFBE ωοτϫʔΫ ιέοτ

Slide 17

Slide 17 text

LinuxにおけるI/O 〜 blocking I/O 4. ランタイムが絡む処理 ෳ਺ѻ͍ͬͯΔ͏ͪͷͭͷGEͰͷ*0͕ϒϩοΫঢ়ଶʹͳΔͱɺͦͷ*0Λ࣮ߦ ͍ͯ͠Δϓϩηε΋TMFFQঢ়ଶʹͳͬͯ͠·͍·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ SFBE ˠಡΈऔΓͷ४උ͕Ͱ͖ͯ ͍ͳ͍ͷͰϒϩοΫ ωοτϫʔΫ ιέοτ

Slide 18

Slide 18 text

LinuxにおけるI/O 〜 blocking I/O 4. ランタイムが絡む処理 ϓϩηε͕TMFFQঢ়ଶʹͳͬͯ͠·͏ͱɺͦͷؒʹଞͷૢ࡞͕Ұ੾Ͱ͖ͳ͘ͳΔ ͷͰޮ཰͕ѱ͍Ͱ͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε TMFFQ XSJUF SFBE ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ ϒϩοΫ͞Ε͍ͯΔ*0͕࣮ߦ͞ΕΔ ·Ͱɺଞͷૢ࡞͕Ͱ͖ͳ͍

Slide 19

Slide 19 text

LinuxにおけるI/O 〜 non-blocking I/O 4. ランタイムが絡む処理 ϒϩοΫΛ๷͙ͨΊʹɺʮ*0ͷ४උ͕Ͱ͖͍ͯͳ͍ͳΒɺΤϥʔΛฦ͢ʯͱ͍ ͏OPOCMPDLJOHϞʔυͰͷ*0΋ߦ͏͜ͱ͕Ͱ͖·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ SFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍

Slide 20

Slide 20 text

LinuxにおけるI/O 〜 non-blocking I/O 4. ランタイムが絡む処理 ϒϩοΫΛ๷͙ͨΊʹɺʮ*0ͷ४උ͕Ͱ͖͍ͯͳ͍ͳΒɺΤϥʔΛฦ͢ʯͱ͍ ͏OPOCMPDLJOHϞʔυͰͷ*0΋ߦ͏͜ͱ͕Ͱ͖·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ SFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍ ˠΤϥʔΛฦ͢ ωοτϫʔΫ ιέοτ

Slide 21

Slide 21 text

多重I/Oの面倒さ 4. ランタイムが絡む処理 ͨͩɺॴ๬ͷૢ࡞Λ͢ΔͨΊʹɺద੾ͳॱ൪ͰOPOCMPDLJOH*0ΛࣗྗͰൃߦ ͠ଓ͚Δͷ͸໘౗Ͱ͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ OPOCMPDLJOHͳSFBEཁٻΛ ੒ޭ͢Δ·Ͱߦ͏ ಡΈࠐΜͩ಺༰ΛXSJUF͢Δ

Slide 22

Slide 22 text

epoll 4. ランタイムが絡む処理 ͦ͜Ͱɺ-JOVYͰ͸ෳ਺ͷ*0Λޮ཰Α͘؅ཧ͢ΔͨΊͷ࢓૊ΈzFQPMMzͱ͍͏΋ ͷ͕͋Γ·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ϑΝΠϧGE ྫ ωοτϫʔΫ ιέοτ FQPMM Πϯ ελ ϯε ؅ཧɾ؂ࢹ *0ͷ४උ͕Ͱ͖ͨ GE͕ͳ͍͔֬ೝ

Slide 23

Slide 23 text

epoll 4. ランタイムが絡む処理 SVOUJNFύοέʔδ಺ʹ͸ɺFQPMMΠϯελϯεͷGEΛอଘ͢ΔͨΊͷάϩʔό ϧม਺FQGE͕͋Γ·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP

Slide 24

Slide 24 text

epoll 4. ランタイムが絡む処理 FQPMMΠϯελϯε͕ඞཁʹͳͬͨஈ֊ͰɺFQPMMDSFBUFؔ਺ʹΑͬͯॳظԽ͞ Ε·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP ॳظԽ

Slide 25

Slide 25 text

ネットワークI/O 4. ランタイムが絡む処理 -JOVYͰ͸ɺωοτϫʔΫ*0͸FQPMMΠϯελϯεܦ༝ͰߦΘΕΔɻ ϑΝΠϧͷొ࿥ SVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ *0ͷ֬ೝ FQPMM Πϯ ελ ϯε *0ͷ༗ແΛ؂ࢹ͍ͨ͠ϑΝΠϧGEΛ FQPMMΠϯελϯεʹొ࿥͢Δ ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@DUMͰ ొ࿥ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@XBJUͰ ໰߹ͤ

Slide 26

Slide 26 text

epoll 4. ランタイムが絡む処理 OFU%JBMؔ਺ʹΑͬͯίωΫγϣϯ0QFO͢ΔͱɺFQPMMDUMؔ਺͕࠷ऴతʹݺ͹Εɺ FQPMMΠϯελϯεʹΑͬͯͦͷDPOO͕ѻ͑ΔΑ͏ʹͳΓ·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP ୧͍ͬͯ͘ͱʜʜ ωοτϫʔΫ ιέοτ ϑΝΠϧGE ؂ࢹର৅ͱͯ͠ ొ࿥

Slide 27

Slide 27 text

epoll 4. ランタイムが絡む処理 OFU%JBMؔ਺ˠFQPMMDUMؔ਺·Ͱͷಓے͸ͱͯ΋௕͍Ͱ͢ɻ ڵຯ͕͋Δํ͸ɺҎԼͷ;FOOॻ੶ͷষΛ͝ཡ͍ͩ͘͞ɻ JOষ (PϥϯλΠϜέʔεελσΟ એ఻ԵXXX

Slide 28

Slide 28 text

ネットワークI/O 4. ランタイムが絡む処理 -JOVYͰ͸ɺωοτϫʔΫ*0͸FQPMMΠϯελϯεܦ༝ͰߦΘΕΔɻ ϑΝΠϧͷొ࿥ SVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ *0ͷ֬ೝ FQPMM Πϯ ελ ϯε *0ͷ༗ແΛ؂ࢹ͍ͨ͠ϑΝΠϧGEΛ FQPMMΠϯελϯεʹొ࿥͢Δ ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@DUMͰ ొ࿥ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@XBJUͰ ໰߹ͤ

Slide 29

Slide 29 text

ネットワークI/O 4. ランタイムが絡む処理 ग़యSVOUJNFQSPDHP . TZTNPO ( *0ऴΘΓͷ(͕ͳ͍͔ ໰߹ͤ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE TZTNPOͷதͰ͸ɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ

Slide 30

Slide 30 text

ネットワークI/O network I/O OFUQPMMؔ਺ͷதͰ͸ɺ·͞ʹFQPMM@XBJUͷଘࡏ͕֬ೝͰ͖Δɻ FQPMM Πϯ ελ ϯε *0Ͱ͖ΔGE͕ͳ͍͔ ֬ೝ ϓϩηε ग़యSVOUJNFOFUQPMM@FQPMMHP

Slide 31

Slide 31 text

ネットワークI/O 4. ランタイムが絡む処理 . TZTNPO ( *0ऴΘΓͷ(͕ͳ͍͔ ໰߹ͤ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE TZTNPOͷதͰ͸ɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ ( *0ऴΘΓͷ(ΛHFU

Slide 32

Slide 32 text

ネットワークI/O 4. ランタイムが絡む処理 . TZTNPO ( TZTNPOͷதͰ͸ɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ ( TDIFE SVOR ( ( ( HFUͨ͠(Λ άϩʔόϧΩϡʔʹೖΕΔ

Slide 33

Slide 33 text

まとめ l FQPMM͸ɺଟॏ*0Λޮ཰Α͘ߦ͏ͨΊͷ-JOVYͷػೳͰ͢ l FQPMMͰॏཁͳͷ͸ҎԼͭͰ͢ ○ FQPMM@DSFBUFFQPMMΠϯελϯεΛ࡞Δ ○ FQPMM@DUMGEΛFQPMMΠϯελϯεʹΑΔ؂ࢹର৅ʹొ࿥ ○ FQPMM@XBJU*0࣮ߦՄೳͳGE͕ͳ͍͔ɺFQPMMΠϯελϯεʹ֬ೝ l (PϥϯλΠϜ಺Ͱ͸ɺFQPMMͷػೳ͕ଘ෼ʹར༻͞Ε͍ͯ·͢

Slide 34

Slide 34 text

epollについて詳しく知りたい方はこちら ΦϥΠϦʔͷz-JOVY4ZTUFN1SPHSBNNJOH OE&EJUJPOz • $IBQUFS 'JMF*0 • $IBQUFS "EWBODFE'JMF*0 Ҏ্ষʹɺ-JOVYʹ͓͚Δ*0͕ৄ͘͠৮ΕΒΕ͍ͯ·͢

Slide 35

Slide 35 text

5IBOLZPVGPSMJTUFOJOH