.NET 5.0中WindowsAzure.Storage的TCP端口耗尽

Vok*_*Vok 5 c# sockets tcp azure azure-storage

我正在运行WindowsAzure.Storage库的最新版本6.1.1。这以前是一个已知问题,但应该已经在.NET 4.5.1中修复。这正是我遇到的问题。

我在Azure存储中命中了一个要插入100m +行的表。我一直专注于使代码快速且可扩展,它使运行Datacenter 2012 R2的Azure D12 VM达到最大化。我看到每秒处理5,000-10,000个实体(读取文件,处理,上传)。

更新:仅在Azure VM上发生。在我的家庭系统上不会发生。

该过程总是以大约16,384批(大约320,000条记录)崩溃,并出现经典的端口耗尽错误:通常,每个套接字地址(协议/网络地址/端口)仅允许使用一种。

我已经做了平常的事情:增加MaxUserPort(64434)和减少TcpTimedWaitDelay(15秒)。鉴于MaxUserPort失败时具有令人怀疑的逻辑16,384,它似乎被忽略了。

Netstat显示,端口从来没有被关闭过。它们的状态始终保持为“已建立”,直到进程本身关闭,然后它们消失为止。

实际的连接代码归结为:

var acx = CloudStorageAccount.Parse(conn);
var client = acx.CreateCloudTableClient();
var table = client.GetTableReference("Test");
var op = new TableBatchOperation();

foreach (var record in batch) //Batch is just a bunch of entity objects
    op.InsertOrReplace(record);

try
{
    await table.ExecuteBatchAsync(op, opsConfig, null);
    Interlocked.Add(ref totalUploaded, batch.Count);
}
catch...
Run Code Online (Sandbox Code Playgroud)

我已经尝试过所有可以想到的变体-重复使用TableBatchOperations池,使用单个表/客户端/帐户为每次匹配以及两者之间的每种组合创建对象。

这个问题似乎是我无法达到的。据推测,两年前解决此问题时,由于未正确读取响应流,因此连接保持打开状态。

感谢任何建议!请问您是否需要更多信息或说明。