Как можно ограничить скорость загрузки? - PullRequest
8 голосов
/ 05 мая 2010

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

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

Ответы [ 3 ]

6 голосов
/ 05 мая 2010

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

3 голосов
/ 05 мая 2010

Без упоминания о платформе / языке трудно ответить, но алгоритм "утечка", вероятно, был бы лучшим вариантом:

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

0 голосов
/ 05 мая 2010

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

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

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

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

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

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

Greetz
back2dos

...