限制azure blob上传速度的方法

时间:2016-08-16 15:25:00

标签: azure azure-storage azure-storage-blobs

我有一个应用程序将数据库备份上传到azure上的blob容器。

我上传的文件大小约为8GB,平均速率为11Mbps

然而,一切都工作正常,当blob被转移到容器时,它绝对会杀死该网络上的其他所有内容。

所以我的问题是,有没有办法将上传速度限制为天蓝色?

3 个答案:

答案 0 :(得分:1)

Azure存储本身不会提供特定的限制设置。但是:鉴于blob上传本质上是一系列基于REST的块blob PUT操作,您可以通过执行自己的上传实现并选择将块上传到给定blob的频率来进行自己的限制。

答案 1 :(得分:0)

在网络接口上设置最大上传带宽可能是更好的方法。这对您的客户端应用程序和完美的设计目标完全透明。您在另一个QoS网络中的软件无需自定义限制即可运行。

SO question is about limiting network speed并列出了一些用于此目的的工具。如果运行数据库备份的计算机使用Windows,请尝试使用BWMeter来限制网络速度。

更好的策略是配置网络,使Internet网关(WAN / DSL路由器)正在进行流量整形。这取决于产品是否运作良好。

这两种方法的长期成本应低于在应用程序中实现自定义限制的替代方法。

答案 2 :(得分:0)

您的问题没有指定您希望实现上传速度限制的编程语言(或原始REST)。但我找到了一种使用官方azure存储.NET SDK(Microsoft.WindowsAzure.Storage)的方法。

SDK本身并未提供明确的速度限制。但是,Upload*Async()函数(例如UploadFromFileAsync())通过IProgress<StorageProgress>实现支持进度报告,并定期调用其Report()方法。 似乎它同步调用它。

因此我们可以在Report()中加一个延迟来限制上传速度。更好的是Report为您提供BytesTransferred的信息。因此,如果您的进度处理程序跟踪持续时间。然后,您可以估计当前的上传速度,并使用它来精确限制。

以下是这个想法的说明。请注意,这仅仅是对该想法的证明。我把它放在一起不到3分钟。速率估算和节流算法非常粗糙,未经过充分测试。

以下是如何使用它

await blob.UploadFromFileAsync(
    @"some_file.dat", 
    null, null, null, 
    new RateThrottleProgress(300 * 1024), // throttle at 300kb/s
    CancellationToken.None);

指数退避Throttler实施

class RateThrottleProgress : IProgress<StorageProgress>
{
    private readonly DateTime start = DateTime.Now;
    private readonly long maxbps;
    private long baseDelay, delay;

    public RateThrottleProgress(long maxbps)
    {
        this.maxbps = maxbps;
        baseDelay = 10;
        delay = baseDelay;
    }

    public void Report(StorageProgress value)
    {
        double duration = (DateTime.Now - start).TotalSeconds;
        double bps = value.BytesTransferred / duration;
        if (bps > maxbps) delay *= 2;
        else delay = Math.Max(baseDelay, delay/2);
        Console.WriteLine($"current estimated upload speed: {bps / 1024.0} KB/s. delay: {delay} ms");
        Thread.Sleep(TimeSpan.FromMilliseconds(delay));
    }
}

我还put below code snippet as a gist以获得更好的版本控制和协作。

节气门有效:

current estimated upload speed: 287.486007463505 KB/s. delay: 10 ms
current estimated upload speed: 290.086402388889 KB/s. delay: 10 ms
current estimated upload speed: 292.685419108659 KB/s. delay: 10 ms
current estimated upload speed: 295.28201245662 KB/s. delay: 10 ms
current estimated upload speed: 297.876060423937 KB/s. delay: 10 ms
current estimated upload speed: 300.469027029562 KB/s. delay: 20 ms
current estimated upload speed: 302.927815243916 KB/s. delay: 40 ms
current estimated upload speed: 305.112558483135 KB/s. delay: 80 ms
current estimated upload speed: 306.778888691779 KB/s. delay: 160 ms
current estimated upload speed: 307.367196107083 KB/s. delay: 320 ms   <-- speed starts to drop from here...
current estimated upload speed: 305.910611140488 KB/s. delay: 640 ms
current estimated upload speed: 300.564767027164 KB/s. delay: 1280 ms
current estimated upload speed: 288.206861583389 KB/s. delay: 640 ms
current estimated upload speed: 283.672713628354 KB/s. delay: 320 ms
current estimated upload speed: 282.668039190231 KB/s. delay: 160 ms
current estimated upload speed: 283.351226090087 KB/s. delay: 80 ms
current estimated upload speed: 284.861107569046 KB/s. delay: 40 ms
current estimated upload speed: 286.781960850501 KB/s. delay: 20 ms
current estimated upload speed: 288.910675693183 KB/s. delay: 10 ms
current estimated upload speed: 291.140146046991 KB/s. delay: 10 ms
current estimated upload speed: 293.358817316007 KB/s. delay: 10 ms