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

Deep dive into sync.Pool

moricho
February 07, 2020

Deep dive into sync.Pool

golang.tokyo#29 20min

moricho

February 07, 2020
Tweet

More Decks by moricho

Other Decks in Programming

Transcript

  1. golang.tokyo#29
    Deep dive
    into
    sync.Pool
    Morito Ikeda | January 2020

    View Slide

  2. ABOUT ME
    ஑ా ৿ਓ(@_moricho_)
    - ܚጯٛक़େֶ ཧ޻ֶ෦
    - Go, Kubernetes, ...
    - AbemaTV, ϦΫϧʔτ, BASE, …
    - ࠷ۙͷझຯɿϑΥϯτΛோΊΔ

    View Slide

  3. Έͳ͞Μɺsync.Pool
    ࢖ͬͯ·͔͢ʁ

    View Slide

  4. TABLE OF
    CONTENTS
    Deep dive into sync.Pool
    ɾsync.Poolͷ֓ཁ/࢖͍ํ
    ɾOSSͰͷsync.Poolར༻ྫ
    ɾsync.PoolͷΞϧΰϦζϜ
    ɾGo1.13ͰͷύϑΥʔϚϯεվળ

    View Slide

  5. Overview of
    sync.Pool
    Introduction

    View Slide

  6. ɾGo1.3͔Βඪ४ύοέʔδʹ
    sync.Poolͷ֓ཁ:
    ɾgoroutineηʔϑͳϝϞϦϓʔϧ
    ɾແବͳϝϞϦׂ౰ͯ/GCίετͷ࡟ݮ

    View Slide

  7. sync.Poolͷ࢖͍ํ:
    ɾάϩʔόϧͳPoolͷ࡞੒
    େ·͔ͳྲྀΕ
    ɾPool͔ΒΦϒδΣΫτΛGet (ͳ͔ͬͨΒ৽ن࡞੒)
    ɾ࢖͍ऴΘͬͨΒۭʹͯ͠PoolʹPut

    View Slide

  8. sync.Poolͷ࢖͍ํ: (Poolͳ͠)
    ɾbytes.Bufferʹจࣈྻ٧ΊΔ͚ͩ
    ɾ౎౓bytes.BufferΛ৽ن࡞੒

    View Slide

  9. sync.Poolͷ࢖͍ํ: (Pool͋Γ)
    ɾbytes.BufferΛPool͔Βऔಘ
    ɾdeferͰbufferͷϦηοτ
    ͱPoolʹ໭͢ॲཧ

    View Slide

  10. sync.Poolͷ࢖͍ํ: (ϕϯνϚʔΫ)
    Poolͳ͠ɿ
    ɾ1࣮ߦ͋ͨΓ1781ms, 1072Bͷallocate, 4ճͷϝϞϦallocate
    Pool͋Γɿ
    ɾ1࣮ߦ͋ͨΓ1192ms, 0Bͷallocate, 0ճͷϝϞϦallocate

    View Slide

  11. sync.Poolͷ࢖͍ํ: (Tips)
    ΦϒδΣΫτΛϦηοτ͢Δͱ͖
    ɾbytes.BufferͳΒReset()ؔ਺
    ɾεϥΠεΛ௚઀౉͢৔߹͸ʁ

    View Slide

  12. sync.Poolͷ࢖͍ํ: (Tips)
    ΦϒδΣΫτΛϦηοτ͢Δͱ͖
    ɾbytes.BufferͳΒReset()ؔ਺
    ɾεϥΠεΛ௚઀౉͢৔߹͸ʁ
    =>

    View Slide

  13. sync.Pool
    usecase in OSS
    usecase

    View Slide

  14. sync.Poolͷར༻ࣄྫ:
    ɾfmt
    ɾsirupsen/logrus
    ɾuber-go/zap

    View Slide

  15. sync.Poolͷར༻ࣄྫ:
    uber-go/zap
    ɾʮreflection-free, zero-allocation JSON encoderʯ
    Λᨳ͍ͬͯΔ

    View Slide

  16. sync.Poolͷར༻ࣄྫ:
    uber-go/zap
    ɾʮreflection-free, zero-allocation JSON encoderʯ
    => ౉͢৘ใΛzap.String΍zap.IntͰϥοϓ
    interface{}Ͱड͚Δ͜ͱΛճආ

    View Slide

  17. sync.Poolͷར༻ࣄྫ:
    uber-go/zap
    ɾʮreflection-free, zero-allocation JSON encoderʯ
    => jsonͷEncoderͱBufferΛPoolͰ؅ཧ

    View Slide

  18. Algorithm of
    sync.Pool
    Internal sync.Pool

    View Slide

  19. sync.PoolͷΞϧΰϦζϜ:
    FreeList
    ɾϝϞϦͷະׂΓ౰ͯྖҬΛ࿈݁ϦετͰ઀ଓ
    ฦ٫͞Εͨ΋ͷ(࠶ར༻͢ΔϝϞϦྖҬ)Λ
    Ϧετʹͭͳ͍Ͱ͍͘

    View Slide

  20. sync.PoolͷΞϧΰϦζϜ:
    FreeList
    ɾϝϞϦͷະׂΓ౰ͯྖҬΛ࿈݁ϦετͰ઀ଓ
    ฦ٫͞Εͨ΋ͷ(࠶ར༻͢ΔϝϞϦྖҬ)Λ
    Ϧετʹͭͳ͍Ͱ͍͘
    => ྖҬΛ༗ޮʹ࢖͑ΔɻϝϞϦޮ཰up!

    View Slide

  21. sync.PoolͷΞϧΰϦζϜ:
    FreeList
    ɾͱ͘ʹɺ͢΂ͯͷΦϒδΣΫταΠζ͕ಉ͡Ͱ͋Δ
    ɹϝϞϦϓʔϧ͔ΒͷׂΓ౰ͯʹ࠷ద

    View Slide

  22. sync.PoolͷΞϧΰϦζϜ:
    FreeList
    ɾͱ͘ʹɺ͢΂ͯͷΦϒδΣΫταΠζ͕ಉ͡Ͱ͋Δ
    ɹϝϞϦϓʔϧ͔ΒͷׂΓ౰ͯʹ࠷ద
    => ϝϞϦͷஅยԽ͕ى͜Γʹ͍͘

    View Slide

  23. sync.PoolͷΞϧΰϦζϜ:
    ͦΜͳsync.Poolʹ΋໰୊͕ɺɺɺ

    View Slide

  24. sync.PoolͷΞϧΰϦζϜ:
    Pool(FreeList)͸ConcurrentηʔϑʹͳΔΑ͏ʹ
    MutexͰLock͕औΒΕ͍ͯΔ
    => ෳ਺ΞΫηε͕͋Δࡍʹ
    ɹ ౰વΦʔόʔϔου͕͋Δ
    ࠔͬͨͱ͜Ζ̍

    View Slide

  25. sync.PoolͷΞϧΰϦζϜ:
    GC͕࢝·Δલʹ͸Pool͕ۭʹͳΔ࢓༷
    => GCޙ͸ίʔϧυελʔτͷঢ়ଶʹͳͬͯ
    ɹ ύϑΥʔϚϯεͷεύΠΫ͕͘Δ
    ࠔͬͨͱ͜Ζ̎
    sync/pool.go: 224-225

    View Slide

  26. Performance
    improvement
    on Go1.13
    Internal sync.Pool

    View Slide

  27. Go1.13ʹ͓͚ΔύϑΥʔϚϯεվળ:
    ɾMutexͷLock͔͔Δ໰୊

    View Slide

  28. Go1.13ʹ͓͚ΔύϑΥʔϚϯεվળ:
    ɾMutexͷLock͔͔Δ໰୊
    => ૒ํ޲࿈݁ͳFreeList΁

    View Slide

  29. Go1.13ʹ͓͚ΔύϑΥʔϚϯεվળ:
    ɾݺͼग़͠ݩ͸headPop()ͱheadPush
    ɾଞͷgoroutine͸tailPop()

    View Slide

  30. Go1.13ʹ͓͚ΔύϑΥʔϚϯεվળ:
    ɾGCޙͷίʔϧυελʔτ໰୊

    View Slide

  31. Go1.13ʹ͓͚ΔύϑΥʔϚϯεվળ:
    ɾGCޙͷίʔϧυελʔτ໰୊
    => Victim Cacheͷ࠾༻
    ɾطଘͷΩϟογϡΛҰஈޙΖͷΩϟογϡʹୀආ
    ɾগͳ͘ͱ΋GC2αΠΫϧ෼ੜ͖࢒Δʂ

    View Slide

  32. Go1.13ʹ͓͚ΔύϑΥʔϚϯεվળ:

    View Slide

  33. ੋඇsync.PoolΛ࢖ͬͯ
    ύϑΥʔϚϯεվળͯ͠Έ͍ͯͩ͘͞

    View Slide

  34. ࠷ޙʹએ఻

    View Slide

  35. ٕज़ॻయ8 (02/29ͷํ)
    ɹͰgolang.tokyo͞Μʹ
    ɹدߘ͍͖ͤͯͨͩ͞·͢

    View Slide

  36. ػձΛ༩͑ͯͩͬͨ͘͞
    hgshgt͞Μɺbudougumi͞Μɺtenntenn͞Μɺ
    Ͳ͏΋͋Γ͕ͱ͏͍͟͝·͢ɻ

    View Slide

  37. ࢀߟ
    ɾCA.go #1 Ͱ sync.Pool ʹ͍ͭͯ஻Γ·ͨ͠ #ca_go

    ɾgolangͰsync.PoolΛ࢖ͬͯলίετˍߴ଎Խ - Carpe Diem

    ɾGoݴޠͷLoggerʮzapʯ͸Կނߴ଎ʹߏ଄Խ͞ΕͨϩάΛग़ྗ͢Δࣄ͕ग़དྷΔͷ͔ʛגࣜձࣾCA Wise
    ɾGo: Understand the Design of Sync.Pool - A Journey With Go - Medium

    ɾsrc/sync/pool.go - The Go Programming Language

    ɾsync: use lock-free structure for Pool stealing · golang/[email protected] · GitHub

    ɾsync: smooth out Pool behavior over GC with a victim cache · golang/[email protected] · GitHub
    ɾGo 1.13த sync.Pool ੋ೗ԿႪԽత? | ୔໠

    ɾGO: sync.Pool తൌགྷ༩ԋࣉ - Goე࿽ᇏ໓ຩ - Golangதจࣾ۠

    View Slide