从Azure Blob存储中下载大blob已被冻结

时间:2015-11-26 09:16:18

标签: azure azure-storage-blobs

我们使用Azure Blob Storage作为大型文件的存储空间(~5-20Gb) 我们的客户报告了问题。下载此类文件有时会停止并永远不会结束。 我已经记录了下载统计信息,并尝试多次下载问题文件。其中一次尝试未成功,现在我有一个图表downloaded_size / time:chart

从16:00到16:12有短暂停顿。暂停之间的间隔相同,但长度增加。在16:12速度变为Kb / s并且从未恢复到正常值。

以下是继续下载的代码(.NET 4.0):

        CloudBlobContainer container = new CloudBlobContainer(new Uri(containerSAS));

        CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);

        var options = new BlobRequestOptions()
        {
            ServerTimeout = new TimeSpan(10, 0, 0, 0),
            RetryPolicy = new LinearRetry(TimeSpan.FromMinutes(2), 100),
        };

        blockBlob.DownloadToStream(outputStream, null, options);

这种问题可能是什么原因?

编辑要获取统计信息,我使用了以下Stream实现:

public class TestControlledFileStream : Stream
{
    private StreamWriter _Writer;
    private long _Size;

    public TestControlledFileStream(string filename)
    {
        this._Writer = new StreamWriter(filename);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        _Size += count;
        _Writer.WriteLine("{0}: ({1}, {2})", DateTime.UtcNow, _Size, count);
    }
    protected override void Dispose(bool disposing)
    {
        if (this._Writer != null)
            this._Writer.Dispose();
    }
}

1 个答案:

答案 0 :(得分:2)

看起来您在下载大型blob时遇到问题。我已经提供了一些步骤来帮助您调试这些问题。

快速评论:您无需为此下载指定线性重试策略。默认的指数重试策略应该足以满足您的方案。通过将此重试策略允许的失败次数设置为100,可能会延长重试无法修复的问题。你有没有理由选择使用线性重试?

调试Azure存储问题

  • 存储分析日志是调试的有用的第一步 为您提供有关您的请求的信息,例如服务器延迟或
    响应状态码。您可以查看可用的信息here 并学习如何使用日志记录here
  • Client-side logging 提供可帮助您缩小范围的客户特定信息 你的问题。
  • 在客户端上使用Fiddler可以提供下载状态的可见性,例如客户端是否正在重试。请注意,这可能会模糊速度或连接问题,因为流量将通过代理运行流量。

如果您获得有关此问题的更多详细信息,我们将能够帮助您解决问题。