Azure BlobWriteStream客户端无法在指定的超时内完成操作

时间:2017-05-31 18:33:56

标签: c# azure azure-storage azure-storage-blobs

我正在尝试将300GB(流式)数据上传到Azure blob存储。 我用来执行上传的代码如下所示:

var stream = blob.OpenWrite();
[...]
// the buffer is filled in with 128KB chunks of data from a larger 300GB file
stream.Write(buffer, offset, count);

上传大约8小时后,我收到以下错误消息:

  

at Microsoft.WindowsAzure.Storage.Core.Util.StorageAsyncResult`1.End()   在c:\ Program Files中   86)\詹金斯\工作空间\ release_dotnet_master \ LIB \ ClassLibraryCommon \核心\的Util \ StorageAsyncResult.cs:线   77点   Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.EndWrite(IAsyncResult的   c:\ Program Files中的asyncResult)   (86)\詹金斯\工作空间\ release_dotnet_master \ LIB \ ClassLibraryCommon \斑点\ BlobWriteStream.cs:线   211

     

ErrorMessage =客户端无法完成其中的操作   指定超时。

作为旁注,我的上传速度约为2MB / s(可能与超时消息有关)。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

根据您的说明和错误消息,如果您不希望它快速超时,我建议您尝试将BlobRequestOptions.MaximumExecutionTime的值更改为更长。

我建议您还可以启用存储诊断日志来查看存储分析日志和指标,以查看延迟是服务器还是端到端延迟。 有关监控,诊断和排除Microsoft Azure存储故障的更多详细信息,您可以参考此article

此外,我建议您尝试使用Microsoft Azure存储数据移动库将大型文件上传到blob存储。

这是专为高性能上载,下载和复制Azure存储Blob和文件而设计的。您可以从VS nuget包管理器安装它。

有关如何使用它的更多详细信息,请参阅此article

这是一个例子:

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
"connectstring");
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = blobClient.GetContainerReference("foobar");
            blobContainer.CreateIfNotExists();
            string sourcePath = @"yourfilepath";
            CloudBlockBlob destBlob = blobContainer.GetBlockBlobReference("foobar");

            TransferManager.Configurations.ParallelOperations = 64;

            SingleTransferContext context = new SingleTransferContext();
            context.ProgressHandler = new Progress<TransferStatus>((progress) =>
            {
                Console.WriteLine("Bytes uploaded: {0}", progress.BytesTransferred);
            });

            var task = TransferManager.UploadAsync(
    sourcePath, destBlob, null, context, CancellationToken.None);
            task.Wait();

它将自动将每个块发送到azure存储,如下所示:

enter image description here

答案 1 :(得分:3)

此问题已在8.1.3版本中解决(之前我使用的是8.1.1)。他们的changelogs

中也提到了这一变化
  
      
  • Blobs(桌面):修正了一个没有遵守MaximumExecutionTime的错误,导致无限等待,如果由于失败,例如收到响应头后网络故障,服务器停止发送部分响应。
  •   
  • 全部(桌面):修复了在重试,取消和表操作期间未处理SendStream的内存泄漏问题。
  •   

基本上,在8.1.3之前,BlobRequestOptions.MaximumExecutionTime被忽略了。