2010-05-05 3 views
8

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

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

+0

вы должны быть более конкретными. каков сценарий? кто скорость загрузки вы хотите ограничить? пользователя конкретного пользователя или, фактически, общую загрузку сервера? почему вы хотите ограничить скорость? и т. д. – back2dos

+1

@ back2dos Я думаю, что «почему ..» часть не имеет значения и никак не поможет. Что касается сценария - вот что я прошу здесь :). –

+0

ОК, «почему» частично не имеет значения. возникает вопрос: что вы пытаетесь выполнить, какова ваша текущая проблема и каково желаемое решение? и какие средства вы считаете нужным? какой сервер вы используете? не будучи более конкретным, я бы сказал, что самый простой способ - разместить ваш сервер в новой Зеландии: P так для разумного ответа, можете ли вы хотя бы сказать, какой веб-сервер вы используете? и что означает «предел»? хотите ли вы равномерное распределение между пользователями? это должен быть HTTP? и так далее. – back2dos

ответ

6

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

+0

Да, хотя маркерное ведро допускает всплески. Вы также можете легко и чисто использовать маркерную марку в иерархической настройке (возможно, вы также можете использовать негерметичное ведро в иерархии, но жесткий лимит протекающего ведра, IMHO, усложняет это). –

0

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

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

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

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

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

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

Greetz
back2dos

Смежные вопросы