В вашем вопросе не указано, на каком языке программирования (или необработанном 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
Это не походит на Лазурном вопрос, а проблема конфигурации сети на вашем конце. Вам нужно исследовать QoS. –
Загрузка выполняется достаточно быстро, сеть в порядке. Проблема в том, что он загружается слишком быстро, я хотел бы каким-то образом отключить его. –
«t абсолютно убивает все остальное в этой сети» - вот почему я предлагаю вам исследовать QoS. Понятно, что ваша сеть не очень хорошая. –