goleak で goroutine leak を検出する

7da19261eb8108002bdc27f67627c63c?s=47 kumatch
January 25, 2020

goleak で goroutine leak を検出する

7da19261eb8108002bdc27f67627c63c?s=128

kumatch

January 25, 2020
Tweet

Transcript

  1. goleak Ͱ gorou*ne leak Λݕग़͢Δ 2020-01-25 Umeda.go 2020 Winter Yosuke

    Kumakura
  2. About • kumatch / ۽૔༸հ • freee גࣜձࣾ ΤϯδχΞ •

    ࠷ۙͷؔ৺͸ےτϨ
  3. gorou%ne leak • channel ΍ sync ύοέʔδͳͲΛ࢖ͬͨʮ଴ͪঢ়ଶʯͷ gorou/ne • ϓϩηε͕ଓ͘ݶΓ࢒Δ

    = memory leak • ଴ͪࣗମ͸ Go ϥϯλΠϜ͕ΑΖ͘͠΍Δ • CPU ফඅ͸ؾʹͳΒͳ͍
  4. gorou%ne leak ൃੜͷྫ 1 func Do(ctx context.Context, send chan int)

    chan int { 2 recv := make(chan int) 3 go func() { 4 for { 5 select { 6 case num := <-recv: 7 send <- num 8 case <-ctx.Done(): // if do not receive 9 return // if do not return 10 } 11 } 12 }() 13 return recv 14 }
  5. uber-go/goleak • h#ps:/ /github.com/uber-go/goleak • gorou7ne leak Λͬ͘͞ͱݕग़Ͱ͖Δศརౕ • ࠷ۙ

    (2020-01-08) v1.0.0 ʹͳͬͨ
  6. uber-go/goleak usage import ( "testing" "go.uber.org/goleak" ) func TestMain(m *testing.M)

    { goleak.VerifyTestMain(m) }
  7. uber-go/goleak demo h"ps:/ /github.com/kumatch-sandbox/goleak

  8. uber-go/goleak ͷ࢓૊Έ • ςετ࣮ߦޙʹ run&me.Stack ͰελοΫτϨʔεΛऔΔ • ͦͷதͷ͏ͪ goleak ͕

    gorou&ne Λআ֎ • ࣗ਎Λ࣮ߦ͍ͯ͠Δ gorou&ne ͱ͔ • ʮ࢒ͬͨ gorou&neʯ͸ɺऴΘͬͯͳ͍΍ͭͱͯ͠ѻ͍ग़ྗ
  9. ߟྀ఺ • ͋͘·Ͱ࣮ߦͨ݁͠Ռʹجͮ͘ݕग़ • ߏจղੳͯ͠஌Βͤͯ͘ΕΔΘ͚Ͱ͸ͳ͍ • ίʔυΧόϨοδ͕௿͍ɾ࣮ར༻ίʔυͱςετίʔυ͕૬ҧ ͍ͯ͠Δ৔߹͸࿙ΕΔՄೳੑ͕͋Δ • ςετ಺Ͱޙॲཧ΋͔ͬ͠Γॻ͘͜ͱ

  10. ·ͱΊ • uber-go/goleak Λςετίʔυʹ࢖͑͹ gorou.ne leak Λݟͭ ͚ΒΕΔ • طଘίʔυΛม͑Δ͜ͱͳ͘

    TestMain() ʹҰߦॻ͚ͩ͘Ͱ ༗ޮ • ࣮ߦ݁Ռʹର͢Δݕग़ͷͨΊద੾ͳར༻ମܥͰςετίʔυΛ ॻ͘͜ͱ