gpt4 book ai didi

azure - 同时运行多个复制操作时如何限制连接数?

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:58 25 4
gpt4 key购买 nike

我的代码可以同时运行 200 个 goroutine。每个 goroutine 问题 Copy串行操作。每个 Copy 发出两个请求:

  1. StartCopy (放置请求)
  2. WaitForCopy (头请求)

在每个 http 请求之后,readAndCloseBody被调用,这对于确保重用连接很重要。此外,我已将传输设置为 http.DefaultTransport 并将 MaxIdleConnsPerHostMaxIdleConns 设置为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com