Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

H.Saki
November 24, 2021

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

More Decks by H.Saki

Other Decks in Technology

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

    View Slide

  2. 自己紹介
    About Me
    l ͖͞ )4BLJ

    ○ ౦େ޻ֶ෦ ˠ ࠓ೥͔Β৽ࣾձਓ
    ○ 5XJUUFS!TBLJFOHJOFFS
    l աڈͷ੒Ռ෺
    FUDʜ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    (
    (

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ۭ
    FQPMM
    Πϯ
    ελ
    ϯε
    *0ऴΘͬͨ(͕ͳ͍͔
    ໰͍߹Θͤ
    ग़యSVOUJNFQSPDHP

    View Slide

  12. 実行可能なGを探索(7/9) 〜 ネットワークI/O待ちの確認
    3. スケジューリングとプリエンプション
    .
    (

    FQPMM
    Πϯ
    ελ
    ϯε
    ͜Εɺ୭ʁʁʁʁ

    View Slide

  13. 8IBUJTlFQPMMz

    View Slide

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

    ϑΝΠϧGE


    ϑΝΠϧGE


    View Slide

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

    SFBE

    ϑΝΠϧGE

    ϑΝΠϧGE


    ϑΝΠϧGE


    View Slide

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

    SFBE

    ϑΝΠϧGE


    ϑΝΠϧGE


    ϑΝΠϧGE


    SFBE

    ωοτϫʔΫ
    ιέοτ

    View Slide

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


    ϑΝΠϧGE


    ϑΝΠϧGE


    SFBE

    ˠಡΈऔΓͷ४උ͕Ͱ͖ͯ
    ͍ͳ͍ͷͰϒϩοΫ ωοτϫʔΫ
    ιέοτ

    View Slide

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

    XSJUF

    SFBE

    ϑΝΠϧGE


    ϑΝΠϧGE


    ϑΝΠϧGE


    ωοτϫʔΫ
    ιέοτ
    ϒϩοΫ͞Ε͍ͯΔ*0͕࣮ߦ͞ΕΔ
    ·Ͱɺଞͷૢ࡞͕Ͱ͖ͳ͍

    View Slide

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


    ϑΝΠϧGE


    ϑΝΠϧGE


    ωοτϫʔΫ
    ιέοτ
    SFBE

    ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍

    View Slide

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


    ϑΝΠϧGE


    ϑΝΠϧGE


    SFBE

    ˠಡΈऔΓͷ४උ͕Ͱ͖͍ͯͳ͍
    ˠΤϥʔΛฦ͢
    ωοτϫʔΫ
    ιέοτ

    View Slide

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


    ϑΝΠϧGE


    ϑΝΠϧGE


    ωοτϫʔΫ
    ιέοτ
    OPOCMPDLJOHͳSFBEཁٻΛ
    ੒ޭ͢Δ·Ͱߦ͏
    ಡΈࠐΜͩ಺༰ΛXSJUF͢Δ

    View Slide

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


    ϑΝΠϧGE


    ϑΝΠϧGE


    ωοτϫʔΫ
    ιέοτ
    FQPMM
    Πϯ
    ελ
    ϯε
    ؅ཧɾ؂ࢹ
    *0ͷ४උ͕Ͱ͖ͨ
    GE͕ͳ͍͔֬ೝ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. ネットワークI/O
    4. ランタイムが絡む処理
    ग़యSVOUJNFQSPDHP
    .
    TZTNPO

    (
    *0ऴΘΓͷ(͕ͳ͍͔
    ໰߹ͤ
    FQPMM
    Πϯ
    ελ
    ϯε
    ϑΝ
    Πϧ
    GE
    ϑΝ
    Πϧ
    GE
    TZTNPOͷதͰ͸ɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ
    ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ

    View Slide

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

    View Slide

  31. ネットワークI/O
    4. ランタイムが絡む処理
    .
    TZTNPO

    (
    *0ऴΘΓͷ(͕ͳ͍͔
    ໰߹ͤ
    FQPMM
    Πϯ
    ελ
    ϯε
    ϑΝ
    Πϧ
    GE
    ϑΝ
    Πϧ
    GE
    TZTNPOͷதͰ͸ɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ
    ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ
    (
    *0ऴΘΓͷ(ΛHFU

    View Slide

  32. ネットワークI/O
    4. ランタイムが絡む処理
    .
    TZTNPO

    (
    TZTNPOͷதͰ͸ɺFQPMMͰৗʹ࣮ߦՄೳͳωοτϫʔΫ*0Λ୳ͯ͠ɺΩϡʔʹ
    ೖΕΔ࡞ۀΛ͍ͯ͠Δɻ
    (
    TDIFE SVOR ( ( (
    HFUͨ͠(Λ
    άϩʔόϧΩϡʔʹೖΕΔ

    View Slide

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

    View Slide

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

    View Slide

  35. 5IBOLZPVGPSMJTUFOJOH

    View Slide