有没有办法阻止Azure Storage PutBlock方法超时



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

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

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

操作已超时

StackTrace

在Microsoft.WindowsAzure.Storage.Core.Executor.ExecuteSync[T](RESTCommand`1cmd,IRetryPolicy policy,OperationContext OperationContext)\r\n位于Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.PutBlock(字符串blockId,流blockData,字符串contentMD5,AccessConditionaccessCondition、Blob请求选项、OperationContextoperationContext)

内部异常堆栈跟踪

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

这种情况通常发生在我异步上传的时候,比如说一次上传40个文件,而这些文件已经造成了瓶颈。很明显,我现在已经将它限制为一次只能有一个文件。但我想知道为什么会发生这种情况,如果有办法防止这种情况发生,让我知道在互联网连接普遍缓慢的情况下不会再次发生?

您可以尝试以下几种方法:

  • 减少并行上传次数:您可以尝试将并行上传次数减少到逻辑处理器的数量(或者可能是逻辑处理器的一半)。例如,如果你有8核处理器,那么你可以尝试并行上传4-8个文件。根据我的经验,并行上传更多的文件实际上会减慢速度。据我所知,原因是大量的上下文切换正在发生
  • 减小块大小:您可以尝试减小块大小
  • 增加请求超时:如果我没有弄错,web请求中的默认请求超时为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秒。您可以尝试增加超时时间。您可以在PutBlock方法中BlobRequestOptions参数的ServerTimeout属性中指定它

最新更新