2016-08-16 2 views
2

У меня есть приложение, которое загружает резервные копии базы данных в контейнер blob на лазуре.Путь к ограничению скорости загрузки azure blob

Я загрузка файлов вокруг 8GB в размере, при средней скорости 11Mbps однако

Все работает отлично, в то время как блобо пересылаются в контейнер, он абсолютно убивает все остальное в этой сети.

Так что мой вопрос: есть ли способ ограничить скорость загрузки до лазурного?

+0

Это не походит на Лазурном вопрос, а проблема конфигурации сети на вашем конце. Вам нужно исследовать QoS. –

+0

Загрузка выполняется достаточно быстро, сеть в порядке. Проблема в том, что он загружается слишком быстро, я хотел бы каким-то образом отключить его. –

+0

«t абсолютно убивает все остальное в этой сети» - вот почему я предлагаю вам исследовать QoS. Понятно, что ваша сеть не очень хорошая. –

ответ

1

Само устройство Azure Storage не будет обеспечивать определенную настройку дроссельной заслонки. Однако: Учитывая, что загрузка blob - это, по сути, серия блоков блочных блочных операций REST PUT, вы можете сделать свое собственное дросселирование, выполнив собственную реализацию загрузки и выбрав, как часто загружать блоки в заданный blob.

+0

Спасибо, Дэвид, я собираюсь попытаться внедрить это сейчас! –

+0

Дэвид, ты рекомендовал этого парня изобретать велосипед. –

+0

@SaschaGottfried Я вообще ничего не рекомендую. Функция, которой хочет OP, не существует. Тем не менее протокол блочной загрузки позволяет такое управление блоками (и есть много статей о загрузке блоков - нет необходимости повторно изобретать это). –

0

Возможно, это лучший подход для настройки максимальной полосы пропускания на сетевом интерфейсе. Это полностью прозрачно для вашего клиентского приложения и хорошая цель дизайна. Ваше программное обеспечение в другой сети QoS будет работать без специального регулирования.

SO question is about limiting network speed и перечислены некоторые инструменты для этой цели. Если машина, работающая с резервными копиями баз данных, использует Windows, попробуйте что-то вроде BWMeter, чтобы ограничить скорость сети.

Гораздо лучше будет сконфигурировать сеть таким образом, чтобы интернет-шлюз (WAN/DSL-маршрутизатор) выполнял формирование трафика. Это зависит от продукта, если это работает достаточно хорошо.

Оба подхода должны иметь меньшую долгосрочную стоимость, чем альтернативный способ, который реализует настраиваемое регулирование в вашем приложении.

0

В вашем вопросе не указано, на каком языке программирования (или необработанном REST) ​​вы хотите добиться дросселирования скорости передачи. Но я нашел способ сделать это, используя официальное лазурное хранилище .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