Как ограничить скорость чтения из сокета tcp [duplicate]

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

var x = elem["foo[]"]; // can't do elem.foo[];

. Это можно расширить до любого свойства, содержащего специальные символы.

21
задан Brian R. Bondy 11 March 2009 в 04:42
поделиться

3 ответа

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

Пусть BandwidthMaxThreshold является искомым пределом полосы пропускания.

Пусть TransferRate является текущей скоростью передачи соединения.

Затем ...

Если вы обнаружите свой TransferRate> BandwidthMaxThreshold, вы выполните SleepTime = 1 + SleepTime * 1.02 (увеличьте время сна на 2%)

До или после каждой сетевой операции выполните Sleep (SleepTime)

Если вы обнаружите, что ваш TransferRate намного ниже, чем ваш BandwidthMaxThreshold, вы можете уменьшить время сна. В качестве альтернативы вы всегда можете разлагать / уменьшать время сна. В конце концов ваш SleepTime снова достигнет 0.

Вместо увеличения на 2% вы также можете увеличить линейное увеличение разницы между TransferRate - BandwidthMaxThreshold.

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

17
ответ дан Brian R. Bondy 26 August 2018 в 00:53
поделиться
  • 1
    @Brian: Почему это '1 +' необходимо? Не будет SleepTime = 1.02 * SleepTime сам по себе увеличивает значение на 2%? – sundar 25 October 2008 в 06:41
  • 2
    Я просто добавил его, чтобы, если ваш SleepTime достигнет 0, он сможет снова расти. Также, чтобы он всегда увеличивался, по крайней мере, на 1, когда он должен расти. – Brian R. Bondy 25 October 2008 в 06:48
  • 3
    Если протокол использует подтверждения, то задержка до получения ответа также может использоваться для обеспечения сквозной задержки конвейера и указания скорости передачи сообщений. Это обеспечит адаптивное решение, которое позволит самонастраиваться в нескольких установках. – Pekka 3 May 2014 в 17:32

Лучшим способом было бы использовать ковш маркера .

Передавать только тогда, когда у вас достаточно токенов для заполнения пакета (1460 байт было бы хорошим количеством) или если вы принимаете сторону, читайте из сокета только тогда, когда у вас достаточно токенов; немного простая математика расскажет вам, сколько времени вам нужно ждать, прежде чем у вас будет достаточно токенов, чтобы вы могли спать с таким количеством времени (будьте осторожны, чтобы рассчитать, сколько жетонов вы получили от того, сколько вы на самом деле спал, так как большинство операционных систем могут спать ваш процесс дольше, чем вы просили).

Чтобы управлять размером пакетов, ограничьте максимальное количество токенов, которые вы можете иметь; хорошее количество может быть на одну секунду для токенов.

12
ответ дан CesarB 26 August 2018 в 00:53
поделиться

Мне повезло с trickle . Это классно, потому что он может дросселировать произвольные пользовательские приложения без изменений. Он работает, предварительно загружая собственные функции оболочки send / recv, которые делают для вас расчет пропускной способности.

Самый большой недостаток, который я нашел, заключался в том, что сложно согласовать несколько приложений, которые вы хотите использовать для конечной полосы пропускания. «trickled» помогает, но мне было сложно.

Обновление в 2017 году: похоже, что тряска переместилась на https://github.com/mariusae/trickle

6
ответ дан Chris Dolan 26 August 2018 в 00:53
поделиться
Другие вопросы по тегам:

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