我的代码可以同时运行 200 个 goroutine。每个 goroutine 问题 Copy
串行操作。每个 Copy
发出两个请求:
-
StartCopy
(放置请求) -
WaitForCopy
(头请求)
在每个 http 请求之后,readAndCloseBody
被调用,这对于确保重用连接很重要。此外,我已将传输设置为 http.DefaultTransport 并将 MaxIdleConnsPerHost
和 MaxIdleConns
设置为 200,这很重要,因为它默认为 DefaultMaxConnsPerHost
= = 2.
尽管如此,当我运行 lsof
时,我经常看到许多超过 200 TCP (ESTABLISHED) 条目 - 有时多达 1000 个。这是一个示例:
main 24217 jsmith 377u IPv4 0x364ecf4bed03d3d 0t0 TCP :50248->51.4.208.24:https (ESTABLISHED)
知道连接可能泄漏的地方/如何限制连接数吗?
package main
import (
"net/http"
"sync"
"time"
"github.com/Azure/azure-sdk-for-go/storage"
)
func main() {
// create and initialize a client
client, _ := storage.NewBasicClient(ACCOUNT_NAME, ACCOUNT_KEY)
// use DefaultTransport with configs that limit conns
client.HTTPClient.Transport = http.DefaultTransport
transp, _ := client.HTTPClient.Transport.(*http.Transport)
client.HTTPClient.Transport = http.DefaultTransport
transp.MaxIdleConnsPerHost = 200
transp.MaxIdleConns = 200
rootClient := client.GetBlobService().GetContainerReference("foo")
numRoutines := 200
numRequestsPerRoutine := 100
var wg sync.WaitGroup
for i := 0; i < numRoutines; i++ {
wg.Add(1)
go func() {
for j := 0; j < numRequestsPerRoutine; j++ {
sourceBlob := rootClient.GetBlobReference("fileA")
destBlob := rootClient.GetBlobReference("dirX/fileA")
destBlob.Copy(sourceBlob.GetURL(), nil)
time.Sleep(250 * time.Millisecond)
}
wg.Done()
}()
}
wg.Wait()
}
我在 OSX 10.3.2 上运行 go1.10 并在 56332fe
使用 github.com/Azure/azure-sdk-for-go/storage
.
最佳答案
有一个connection leak in the azure library .该修复程序已合并到 dev
中,可能会包含在下一个版本中。
关于azure - 同时运行多个复制操作时如何限制连接数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49725161/