Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

About • kumatch / ۽૔༸հ • freee גࣜձࣾ ΤϯδχΞ • ࠷ۙͷؔ৺͸ےτϨ

Slide 3

Slide 3 text

gorou%ne leak • channel ΍ sync ύοέʔδͳͲΛ࢖ͬͨʮ଴ͪঢ়ଶʯͷ gorou/ne • ϓϩηε͕ଓ͘ݶΓ࢒Δ = memory leak • ଴ͪࣗମ͸ Go ϥϯλΠϜ͕ΑΖ͘͠΍Δ • CPU ফඅ͸ؾʹͳΒͳ͍

Slide 4

Slide 4 text

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 }

Slide 5

Slide 5 text

uber-go/goleak • h#ps:/ /github.com/uber-go/goleak • gorou7ne leak Λͬ͘͞ͱݕग़Ͱ͖Δศརౕ • ࠷ۙ (2020-01-08) v1.0.0 ʹͳͬͨ

Slide 6

Slide 6 text

uber-go/goleak usage import ( "testing" "go.uber.org/goleak" ) func TestMain(m *testing.M) { goleak.VerifyTestMain(m) }

Slide 7

Slide 7 text

uber-go/goleak demo h"ps:/ /github.com/kumatch-sandbox/goleak

Slide 8

Slide 8 text

uber-go/goleak ͷ࢓૊Έ • ςετ࣮ߦޙʹ run&me.Stack ͰελοΫτϨʔεΛऔΔ • ͦͷதͷ͏ͪ goleak ͕ gorou&ne Λআ֎ • ࣗ਎Λ࣮ߦ͍ͯ͠Δ gorou&ne ͱ͔ • ʮ࢒ͬͨ gorou&neʯ͸ɺऴΘͬͯͳ͍΍ͭͱͯ͠ѻ͍ग़ྗ

Slide 9

Slide 9 text

ߟྀ఺ • ͋͘·Ͱ࣮ߦͨ݁͠Ռʹجͮ͘ݕग़ • ߏจղੳͯ͠஌Βͤͯ͘ΕΔΘ͚Ͱ͸ͳ͍ • ίʔυΧόϨοδ͕௿͍ɾ࣮ར༻ίʔυͱςετίʔυ͕૬ҧ ͍ͯ͠Δ৔߹͸࿙ΕΔՄೳੑ͕͋Δ • ςετ಺Ͱޙॲཧ΋͔ͬ͠Γॻ͘͜ͱ

Slide 10

Slide 10 text

·ͱΊ • uber-go/goleak Λςετίʔυʹ࢖͑͹ gorou.ne leak Λݟͭ ͚ΒΕΔ • طଘίʔυΛม͑Δ͜ͱͳ͘ TestMain() ʹҰߦॻ͚ͩ͘Ͱ ༗ޮ • ࣮ߦ݁Ռʹର͢Δݕग़ͷͨΊద੾ͳར༻ମܥͰςετίʔυΛ ॻ͘͜ͱ