Как возможно ограничить скорость загрузки?

В последнее время я задал этот вопрос. Но ответ не удовлетворяет моим требованиям, и я знаю, что поставщикам хостинга файлов действительно удается ограничить скорость. Таким образом, я задаюсь вопросом, что общий алгоритм/метод должен сделать это (я действительно означаю загружать технику) - в особенности ограничение одной скорости загрузки соединения/пользователя.

@back2dos, который я хочу дать конкретному пользователю особую скорость загрузки (соответствующий возможностям оборудования, конечно) или другими словами дать пользовательской способности загрузить некоторый конкретный файл, позволяет, говорят 20kb/s. Конечно, я хочу иметь способность изменить это на некоторое другое значение.

8
задан Community 23 May 2017 в 12:01
поделиться

3 ответа

Вы можете использовать ведро токенов ( http://en.wikipedia.org/wiki/Token_bucket )

{{ 1}}
6
ответ дан 5 December 2019 в 18:57
поделиться

Без упоминания платформы / языка ответить сложно, но, вероятно, лучше всего подойдет алгоритм «дырявого ведра»:

http://en.wikipedia.org/wiki/Leaky_bucket

3
ответ дан 5 December 2019 в 18:57
поделиться

Ну, поскольку этот ответ действительно общий, вот очень простой подход для простого TCP:

Вы помещаете обработчики ресурсов всех загружаемых соединений в список, сопряженный с информацией о том, какие данные запрашиваются, и перебираете его. Затем вы записываете кусок требуемых данных на сокет, возможно, около 1.5K, что является наиболее часто используемым максимальным размером сегмента, насколько я знаю. Когда вы дойдете до конца списка, вы начинаете сначала. Перед тем как начать сначала, просто подождите, чтобы получить желаемую среднюю пропускную способность.

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

Кроме того, если подключено слишком много клиентов, у вас фактически не будет достаточно времени для записи во все сокеты, таким образом, после одного цикла вам "придется ждать отрицательное время". Увеличение размера чанка может ускорить работу в таких сценариях, но в какой-то момент ваш сервер перестанет становиться быстрее.

Более простой подход - делать это на стороне клиента, но это может привести к большим накладным расходам. Самая простая идея заключается в том, чтобы клиент запрашивал 1K каждые 50 мс (предполагая, что вам нужно 20KB/s). Вы даже можете сделать это по HTTP, хотя я настоятельно рекомендую больший размер чанка, поскольку HTTP имеет огромные накладные расходы.

Я думаю, что лучше всего попытаться найти веб-сервер, способный делать такие вещи из коробки. Думаю, в Apache есть несколько модулей для квотирования.

greetz
back2dos

0
ответ дан 5 December 2019 в 18:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: