amazon-web-services - aws-sdk-go 中的 Goroutine 泄漏?

标签 amazon-web-services go amazon-s3 aws-sdk-go

我有以下使用当前 aws-sdk-go 版本 v1.7.9 的代码片段。

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

我记录调用 GetBucketLocation() 前后的调用堆栈。我看到 goroutines 的总数增加了两个,随后运行了这两个额外的 goroutines:

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() 的调用次数的增加而不断累积。

是我做错了什么(忽略关闭某些资源)还是 aws-sdk-go 中发生了 goroutine 泄漏?

请注意,使用 s3manager.Downloader::Download() 函数可以观察到相同的行为。

最佳答案

事实证明,我所说的例程不会随时间消失是不正确的。如果我在调用 GetBucketLocation 之后添加 10 秒的 sleep ,然后再打印出 goroutine 的堆栈,那么额外的例程确实会消失。

我相信这是因为 golang 的 net/http 包维护了某种可以重用的连接池。请参阅以下讨论: https://groups.google.com/forum/#!topic/golang-nuts/QckzdZmzlk0

等待足够长的时间似乎最终会关闭连接并停止 goroutine。

关于amazon-web-services - aws-sdk-go 中的 Goroutine 泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42799213/

相关文章:

go - 如何解码嵌套的未知字段

ios - 将 jpg 上传到 S3 : "The request body terminated unexpectedly"

amazon-web-services - 如何使用 Amazon Product Advertising API 搜索其他国家/地区

amazon-web-services - 在 AWS Route 53 上安装 Go Daddy SSL 证书

JSON Unmarshal 不适用于 relect 创建的动态结构

ios - 文件上传到适用于 iOS 的 Amazon S3 的进度条?

amazon-s3 - AppHarbor 和 Amazon S3 的良好日志记录策略

amazon-web-services - 如何用aws cli或sdk更改API Gateway当前阶段的部署版本?

ssh - 尝试连接到 Amazon EC2 实例时通过 ssh 提示输入密码

rest - 将参数传递给 GET 请求