2016-10-05 3 views
6

Можно ли ограничить глобальную или пропускную способность канала сервером с помощью Netty?Пропускная способность сервера Throttle в процентах с использованием Netty

Я могу установить явные ограничения скорости чтения или записи через GlobalChannelTrafficShapingHandler, но я пытаюсь ограничить глобальную пропускную способность сервера примерно половиной доступной полосы пропускания. Поэтому, если сервер может загружаться со скоростью 8 Мбайт/с, я хочу ограничить загрузку примерно до 4 МБ/с. И я хочу, чтобы сервер настраивался с учетом изменений пропускной способности; поэтому, если скорость загрузки сервера снизится до 5 МБ/с (возможно, из-за использования сети другими приложениями), я хочу ограничить скорость до 2,5 МБ/с.

Я играл с переопределением AbstractTrafficShapingHandler.submitWrite() и добавлял задержку, основанную на длительности с предыдущего вызова, но логика кажется хрупкой и ненадежной.

Любые идеи о том, как разумно подойти к этой проблеме?

+0

Возможно, QoS будет проще в этом случае. Если вы используете Linux, попробуйте http://superuser.com/questions/309063/how-can-i-prioritise-network-bandwidth-on-a-per-application-basis – kichik

+0

@kichik Это для Java-приложения, которое работает на Win/Mac/Linux. – dejuknow

+0

Очень сложно узнать, что такое «доступная полоса пропускания». Такие вещи, как «скорость ссылок», скорее всего, будут бесполезны, поскольку в большинстве систем узкое место, скорее всего, будет где-то дальше по линии. Помимо этого, глядя на совокупную пропускную способность, используемую приложением, вряд ли будет очень точной, поскольку она зависит одновременно от других приложений на хосте и любых узких мест, которые могут быть специфическими для любого клиента, находящегося в конце вашего TCP/IP-соединения , – BeeOnRope

ответ

3

Рассматривали ли вы использование GlobalTrafficShapingHandler и периодически отпускали его на полную мощность, чтобы выяснить максимальную пропускную способность сервера и затем ограничить его до половины?

я бы периодически делать следующее (по расписанию, может быть, 1 секунду из каждой минуты)

  • Увеличение setReadLimitsetWriteLimit до максимума вы когда-нибудь позволит
  • используя GlobalTrafficShapingHandler s TrafficCounter (через public trafficCounter()), чтобы сбросить счет, позвонив по телефону resetCumulativeTime
  • Убедитесь, что интервал TrafficCounter короче или равен времени, в течение которого вы хотите пробовать. Изменить это с помощью TrafficCounter.configure(long)
  • Sample в TrafficCounter, чтобы получить ширину полосы пропускания максимальную сервера
  • Измените GlobalTrafficShapingHandler использовать половину ширины полосы вы просто вычисленной

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

+0

Я награду щедростью. Это более или менее то, что я пытался сделать, добавляя задержку в AbstractTrafficShapingHandler.submitWrite() (за исключением того, что я отбирал каждый другой запрос). Полагаю, что путь периодической выборки - лучший способ. Спасибо! – dejuknow

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

  • Нет связанных вопросов^_^