Save 37% off PRO during our Black Friday Sale! »

epollによるNetwork I/O in Goランタイム

3933b943fb70400bbc26f3cb78d8204c?s=47 H.Saki
November 24, 2021

epollによるNetwork I/O in Goランタイム

21/11/24 Go Reject Con 2021にて発表
https://moneyforward.connpass.com/event/228698/

3933b943fb70400bbc26f3cb78d8204c?s=128

H.Saki

November 24, 2021
Tweet

Transcript

  1. スケジューラから学ぶ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
  2. 自己紹介 About Me l ͖͞ )4BLJ ◦ ౦େ޻ֶ෦ ˠ ࠓ೥͔Β৽ࣾձਓ

    ◦ 5XJUUFS!TBLJFOHJOFFS l աڈͷ੒Ռ෺ FUDʜ
  3. Go Conference 2021 Autumn ʮεέδϡʔϥ͔ΒֶͿ(PϥϯλΠϜʯͱ͍͏λΠτϧͰొஃ͖ͯ͠·ͨ͠ɻ

  4. ຊηογϣϯͷ·ͱΊ

  5. 1章 ランタイムとは l (PϥϯλΠϜϓϩάϥϜΛಈ͔͢ͷʹඞཁͳࡉʑͱͨ͠ॲཧΛɺਓͷ୅Θ ΓʹҾ͖ड͚ͯ͘ΕΔՕॴ ϝϞϦͷׂΓ౰ͯ intܕͭΛ֨ೲ͢ΔϝϞϦ͸ ࣗಈͰ֬อ͞ΕΔ ஫$ݴޠͩͱmallocͳͲͰ ໌ࣔతʹ֬อ͢Δඞཁ͋Γ

    (PϥϯλΠϜͷ໾ׂ ΨϕʔδίϨΫτ εέδϡʔϦϯά ࢖͍ऴΘͬͨม਺arrayͷ ϝϞϦղ์͸ࣗಈͰߦΘΕΔ ஫$ݴޠͩͱfreeͰ ໌ࣔతʹղ์͢Δඞཁ͋Γ ฒߦͳؔ਺Λ࣮ࡍʹͲͷλΠ ϛϯάͰಈ͔͢ͷ͔͸ࣗಈͰ ௐ੔͞ΕΔ
  6. 2章 Goランタイムのコンポーネント l (PϥϯλΠϜʹ͸ͭͷίϯϙʔωϯτ͕͋Γ·͢ɻ ໾ׂ ΰʔϧʔνϯ ( . 1 04εϨου

    ࣮ߦϦιʔεɺԾ૝$16 ུশ ໾ׂ ϥϯλΠϜશମͷঢ়ଶ؅ཧ TDIFE TZTNPO ( γεςϜϞχλ εέδϡʔϥͷ࣮ଶ ུশ ( . 1 ( ( ( . TZTNPO ( ( 
  7. 3章 スケジューリングとプリエンプション l εέδϡʔϦϯά(ͱ.Λͭͳ͛Δ l ϓϦΤϯϓγϣϯ(ͱ.Λ੾Γ཭͢ l ͲͪΒ΋(PϥϯλΠϜ͕ߦ͏ػೳͰ͢ γεςϜίʔϧͷݺͼग़͠ (

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

    ( . 1ૢ࡞ͷ۩ମྫ ϓϦΤϯϓγϣϯ εέδϡʔϦϯά 1 . ( ( ( . 1 . ( ( ( 1 . ( ( (
  9. アジェンダ  ϥϯλΠϜͱ͸ ʜʜϥϯλΠϜͬͯԿʁ  (PϥϯλΠϜͷίϯϙʔωϯτ ʜʜϥϯλΠϜͬͯͲΜͳ෦඼Ͱग़དྷ͍ͯΔͷʁ  εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ ʜʜϥϯλΠϜʹ͸͜ͷΑ͏ͳػೳ͕͋Γ·͢

     ϥϯλΠϜ͕བྷΉॲཧ ʜʜϥϯλΠϜͷػೳ͸͜ͷΑ͏ͳ৔ॴ Ϣʔεέʔε Ͱ࢖ΘΕ·͢  ϥϯλΠϜΛֶͿʹ͸
  10. アジェンダ  ϥϯλΠϜͱ͸  (PϥϯλΠϜͷίϯϙʔωϯτ  εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ  ϥϯλΠϜ͕བྷΉॲཧ 

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

     ۭ FQPMM Πϯ ελ ϯε *0ऴΘͬͨ(͕ͳ͍͔ ໰͍߹Θͤ ग़యSVOUJNFQSPDHP
  12. 実行可能なGを探索(7/9) 〜 ネットワークI/O待ちの確認 3. スケジューリングとプリエンプション . (  FQPMM Πϯ

    ελ ϯε ͜Εɺ୭ʁʁʁʁ
  13. 8IBUJTlFQPMMz

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

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

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

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

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

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

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

    ιέοτ ϓϩηε ϑΝΠϧGE  ྫ ϑΝΠϧGE  ྫ ϑΝΠϧGE  ྫ SFBE ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍ ˠΤϥʔΛฦ͢ ωοτϫʔΫ ιέοτ
  21. 多重I/Oの面倒さ 4. ランタイムが絡む処理 ͨͩɺॴ๬ͷૢ࡞Λ͢ΔͨΊʹɺద੾ͳॱ൪ͰOPOCMPDLJOH*0ΛࣗྗͰൃߦ ͠ଓ͚Δͷ͸໘౗Ͱ͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE

     ྫ ϑΝΠϧGE  ྫ ϑΝΠϧGE  ྫ ωοτϫʔΫ ιέοτ OPOCMPDLJOHͳSFBEཁٻΛ ੒ޭ͢Δ·Ͱߦ͏ ಡΈࠐΜͩ಺༰ΛXSJUF͢Δ
  22. epoll 4. ランタイムが絡む処理 ͦ͜Ͱɺ-JOVYͰ͸ෳ਺ͷ*0Λޮ཰Α͘؅ཧ͢ΔͨΊͷ࢓૊ΈzFQPMMzͱ͍͏΋ ͷ͕͋Γ·͢ɻ ϑΝΠϧ ωοτϫʔΫ ιέοτ ϓϩηε ϑΝΠϧGE

     ྫ ϑΝΠϧGE  ྫ ϑΝΠϧGE  ྫ ωοτϫʔΫ ιέοτ FQPMM Πϯ ελ ϯε ؅ཧɾ؂ࢹ *0ͷ४උ͕Ͱ͖ͨ GE͕ͳ͍͔֬ೝ
  23. epoll 4. ランタイムが絡む処理 SVOUJNFύοέʔδ಺ʹ͸ɺFQPMMΠϯελϯεͷGEΛอଘ͢ΔͨΊͷάϩʔό ϧม਺FQGE͕͋Γ·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP

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

    ॳظԽ
  25. ネットワークI/O 4. ランタイムが絡む処理 -JOVYͰ͸ɺωοτϫʔΫ*0͸FQPMMΠϯελϯεܦ༝ͰߦΘΕΔɻ ϑΝΠϧͷొ࿥ SVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ *0ͷ֬ೝ FQPMM

    Πϯ ελ ϯε *0ͷ༗ແΛ؂ࢹ͍ͨ͠ϑΝΠϧGEΛ FQPMMΠϯελϯεʹొ࿥͢Δ ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@DUMͰ ొ࿥ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@XBJUͰ ໰߹ͤ
  26. epoll 4. ランタイムが絡む処理 OFU%JBMؔ਺ʹΑͬͯίωΫγϣϯ0QFO͢ΔͱɺFQPMMDUMؔ਺͕࠷ऴతʹݺ͹Εɺ FQPMMΠϯελϯεʹΑͬͯͦͷDPOO͕ѻ͑ΔΑ͏ʹͳΓ·͢ɻ FQPMM Πϯ ελ ϯε ग़యSVOUJNFOFUQPMM@FQPMMHP

    ୧͍ͬͯ͘ͱʜʜ ωοτϫʔΫ ιέοτ ϑΝΠϧGE ؂ࢹର৅ͱͯ͠ ొ࿥
  27. epoll 4. ランタイムが絡む処理 OFU%JBMؔ਺ˠFQPMMDUMؔ਺·Ͱͷಓے͸ͱͯ΋௕͍Ͱ͢ɻ ڵຯ͕͋Δํ͸ɺҎԼͷ;FOOॻ੶ͷষΛ͝ཡ͍ͩ͘͞ɻ JOষ (PϥϯλΠϜέʔεελσΟ એ఻ԵXXX

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

    Πϯ ελ ϯε *0ͷ༗ແΛ؂ࢹ͍ͨ͠ϑΝΠϧGEΛ FQPMMΠϯελϯεʹొ࿥͢Δ ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@DUMͰ ొ࿥ FQPMM Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE FQPMM@XBJUͰ ໰߹ͤ
  29. ネットワークI/O 4. ランタイムが絡む処理 ग़యSVOUJNFQSPDHP . TZTNPO ( *0ऴΘΓͷ(͕ͳ͍͔ ໰߹ͤ FQPMM

    Πϯ ελ ϯε ϑΝ Πϧ GE ϑΝ Πϧ GE TZTNPOͷதͰ͸ɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ
  30. ネットワークI/O network I/O OFUQPMMؔ਺ͷதͰ͸ɺ·͞ʹFQPMM@XBJUͷଘࡏ͕֬ೝͰ͖Δɻ FQPMM Πϯ ελ ϯε *0Ͱ͖ΔGE͕ͳ͍͔ ֬ೝ

    ϓϩηε ग़యSVOUJNFOFUQPMM@FQPMMHP
  31. ネットワークI/O 4. ランタイムが絡む処理 . TZTNPO ( *0ऴΘΓͷ(͕ͳ͍͔ ໰߹ͤ FQPMM Πϯ

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

    SVOR ( ( ( HFUͨ͠(Λ άϩʔόϧΩϡʔʹೖΕΔ
  33. まとめ l FQPMM͸ɺଟॏ*0Λޮ཰Α͘ߦ͏ͨΊͷ-JOVYͷػೳͰ͢ l FQPMMͰॏཁͳͷ͸ҎԼͭͰ͢ ◦ FQPMM@DSFBUFFQPMMΠϯελϯεΛ࡞Δ ◦ FQPMM@DUMGEΛFQPMMΠϯελϯεʹΑΔ؂ࢹର৅ʹొ࿥ ◦

    FQPMM@XBJU*0࣮ߦՄೳͳGE͕ͳ͍͔ɺFQPMMΠϯελϯεʹ֬ೝ l (PϥϯλΠϜ಺Ͱ͸ɺFQPMMͷػೳ͕ଘ෼ʹར༻͞Ε͍ͯ·͢
  34. epollについて詳しく知りたい方はこちら ΦϥΠϦʔͷz-JOVY4ZTUFN1SPHSBNNJOH OE&EJUJPOz • $IBQUFS  'JMF*0 • $IBQUFS 

    "EWBODFE'JMF*0 Ҏ্ষʹɺ-JOVYʹ͓͚Δ*0͕ৄ͘͠৮ΕΒΕ͍ͯ·͢
  35. 5IBOLZPVGPSMJTUFOJOH