2017-03-15 55 views
1

我有以下snippit代碼使用當前aws-sdk-go版本v1.7.9。aws-sdk-go中的Goroutine泄漏?

sess, _ := session.NewSession() 
s3client := s3.New(sess) 
location, err := s3client.GetBucketLocation(&s3.GetBucketLocationInput{Bucket: &bucket}) 

我在調用GetBucketLocation()之前和之後記錄調用堆棧。我看夠程總數由兩個增加,這兩個額外的夠程之後運行:

goroutine 45 [IO wait]: 
net.runtime_pollWait(0x2029008, 0x72, 0x8) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/runtime/netpoll.go:160 +0x59 
net.(*pollDesc).wait(0xc420262610, 0x72, 0xc42003e6f0, 0xc4200121b0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/fd_poll_runtime.go:73 +0x38 
net.(*pollDesc).waitRead(0xc420262610, 0xbcb200, 0xc4200121b0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/fd_poll_runtime.go:78 +0x34 
net.(*netFD).Read(0xc4202625b0, 0xc42022fc00, 0x400, 0x400, 0x0, 0xbcb200, 0xc4200121b0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/fd_unix.go:243 +0x1a1 
net.(*conn).Read(0xc42023c068, 0xc42022fc00, 0x400, 0x400, 0x0, 0x0, 0x0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/net.go:173 +0x70 
crypto/tls.(*block).readFromUntil(0xc42017c060, 0x2029248, 0xc42023c068, 0x5, 0xc42023c068, 0xc400000000) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/crypto/tls/conn.go:476 +0x91 
crypto/tls.(*Conn).readRecord(0xc42029a000, 0x840917, 0xc42029a108, 0xc420116ea0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/crypto/tls/conn.go:578 +0xc4 
crypto/tls.(*Conn).Read(0xc42029a000, 0xc420196000, 0x1000, 0x1000, 0x0, 0x0, 0x0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/crypto/tls/conn.go:1113 +0x116 
net/http.(*persistConn).Read(0xc42000ba00, 0xc420196000, 0x1000, 0x1000, 0x23d3b0, 0xc42003eb58, 0x7a8d) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/http/transport.go:1261 +0x154 
bufio.(*Reader).fill(0xc42000cba0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/bufio/bufio.go:97 +0x10c 
bufio.(*Reader).Peek(0xc42000cba0, 0x1, 0xc42003ebbd, 0x1, 0x0, 0xc42000cc00, 0x0) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/bufio/bufio.go:129 +0x62 
net/http.(*persistConn).readLoop(0xc42000ba00) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/http/transport.go:1418 +0x1a1 
created by net/http.(*Transport).dialConn 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/http/transport.go:1062 +0x4e9 

goroutine 46 [select]: 
net/http.(*persistConn).writeLoop(0xc42000ba00) 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/http/transport.go:1646 +0x3bd 
created by net/http.(*Transport).dialConn 
     /usr/local/Cellar/go/1.7.4_2/libexec/src/net/http/transport.go:1063 +0x50e 

這些程序不會隨時間而消失,他們不斷積累的多個電話到GetBucketLocation由()。

我做錯了什麼(忽略關閉一些資源)還是有一個goroutine泄漏發生在aws-sdk-go?

注意與s3manager.Downloader::Download()功能相同的行爲。

+0

活動連接對於HTTP客戶端來說是正常的,並且您可能與您已聯繫的每個遠程主機有多個連接。這些增長是無限的嗎? – JimB

回答

0

事實證明,我在說明這些例程不會隨着時間消失而不正確。如果我在調用GetBucketLocation之後添加一個10秒鐘的睡眠,在打印出一堆goroutine之前,那麼額外的例程確實消失了。

我相信這樣做的原因是,golang的net/http包維護着某種可以重用的連接池。請參閱以下討論: https://groups.google.com/forum/#!topic/golang-nuts/QckzdZmzlk0

等待足夠長的時間似乎最終會關閉連接並停止goroutines。