有没有办法阻止Azure存储PutBlock方法超时?

时间:2015-02-09 11:30:22

标签: c# azure storage

我有一种将文件上传到Azure到我的存储帐户的方法。我的方法很简单

blob = new CloudBlockBlob(new Uri(Uri));
var ms = new MemoryStream(block.Data);
blob.PutBlock(block.BlockId, ms, null)

但有时我的PutBlock会抛出异常:

  

操作已超时

栈跟踪

  

在   Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T](RESTCommand`1   cmd,IRetryPolicy策略,OperationContext operationContext)\ r \ n at   Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.PutBlock(字符串   blockId,Stream blockData,String contentMD5,AccessCondition   accessCondition,BlobRequestOptions选项,OperationContext   的OperationContext)

内部异常堆栈跟踪

  

at System.Net.HttpWebRequest.GetRequestStream(TransportContext&   上下文)\ r \ n在System.Net.HttpWebRequest.GetRequestStream()\ r \ n中   在   Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T](RESTCommand`1   cmd,IRetryPolicy策略,OperationContext operationContext)"

这通常发生在我异步上传40个文件时,文件已经造成了瓶颈。我显然现在一次将它限制为1个文件。但是我想知道为什么会发生这种情况,如果有办法阻止它,那么我知道它会再次发生,因为一般来说网络连接速度很慢?

1 个答案:

答案 0 :(得分:1)

您可以尝试一些事项:

  • 减少并行上传的次数:您可以尝试将并行上传的数量减少到说逻辑处理器的数量(或者可能是其中的一半)。例如,如果您有8个核心处理器,那么您可以尝试并行上传4到8个文件。根据我的经验,并行上传更多文件实际上会降低速度。根据我的理解,正在进行大量上下文切换的原因正在发生。
  • 减小块大小:您可以尝试减小块大小。
  • 增加请求超时:如果我没有弄错,网络请求中的默认请求超时为100秒(https://msdn.microsoft.com/en-us/library/system.net.webrequest.timeout%28v=vs.110%29.aspx)。你可以尝试增加它。这将照顾来自客户端的超时。还有服务器端请求超时,默认情况下为30秒(有一些例外)。您可以在此处详细了解服务器端超时:https://msdn.microsoft.com/en-us/library/azure/dd179431.aspx如果我没弄错,默认请求超时为90秒。您可以尝试增加超时。您可以在ServerTimeout方法的BlobRequestOptions参数的PutBlock属性中指定它。