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

标签 azure go tcp azure-storage

我的代码可以同时运行 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/

相关文章:

azure - 创建多个事件中心接收器以同时处理大量数据

azure - 通过门户从 azure blob 容器下载多个文件,而不是一次下载一个文件

Azure:将powershell的结果存储到存储帐户中

java.io.IOException : More data recieved than is allowed by the channel data window

java - 数据输入 : Bytes lost over TCP

azure - 如何使用 Windows Azure SDK 2.0 插入/更新到 Azure 表

go - 将大量数据写入 exec.Command().StdinPipe() 错误

go - 如何检查 go template 是否使用了所有模板数据

post - 带有 Go 后端的 Flutter/Dart 前端中的发布请求问题

java - 如何确定服务器是否关闭了 Java 中的连接(收到 RST 数据包)?