我正在运行最新版本的WindowsAzure.Storage库6.1.1。这是以前的known issue,但应该已经修复回.NET 4.5.1。这正是我遇到的问题。
我正在使用100米以上的行插入Azure存储中的表。我专注于使代码快速和可扩展,它最大化了运行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...
我已经尝试了我能想到的每一个变体 - 重用一个TableBatchOperations池,有一个表/客户端/帐户来为每个匹配创建一个对象,以及它们之间的每个组合。
问题似乎比我能达到的水平低。当问题在两年前被解决时,连接保持开放,因为响应流未被正确读取。
感谢任何建议!请询问您是否需要更多信息或说明。