Программное определение максимальной скорости передачи - PullRequest
4 голосов
/ 07 мая 2010

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

На данный момент единственное решение, которое я могу придумать, - это передать несколько мегабайт между клиентом и сервером, а затем измерить, какперевод взял.Однако это решение очень нежелательно, поскольку при наличии 100 000 клиентов это может привести к чрезмерному увеличению пропускной способности нашего сервера (которая уже слишком высока).

У кого-нибудь есть какие-либо решения этой проблемы?

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

РЕДАКТИРОВАТЬ: После дальнейшего расследования я не думаю, что это возможно;слишком много переменных используется для точного измерения максимальной скорости передачи при выходе из сети интернет-провайдера.Оставьте вопрос открытым, если кто-то придет к точному решению.

Ответы [ 5 ]

2 голосов
/ 07 мая 2010

Если вы можете ограничить код Windows Vista или более поздней версией (маловероятно, но кто знает?), Вы можете использовать SetPerTcpConnectionEStats и GetPerTcpConnectionEStats вместе с TCP_ESTATS_BANDWIDTH_RW_v0, чтобы Windows оценила пропускную способность соединения, а затем извлекла эту оценку. Затем, основываясь на этой оценке, вы можете ограничить используемую полосу пропускания.

Итак, что вы можете сделать, это запустить приложение, как сейчас, собирать статистику на некоторое время, а затем вводить регулирование на основе того, что вы измерили в этот начальный период времени.

Это имеет то преимущество, что позволяет избежать отправки дополнительных данных только для сбора информации о пропускной способности - он просто собирает статистику по данным, которые вы отправляете в любом случае. У него есть недостаток (который я подозреваю, что это почти неизбежно), что он все еще использует что-то, приближающееся к полной пропускной способности, пока вы не получите оценку доступной пропускной способности (и, как упоминалось выше, это было добавлено в Windows Vista, так что это даже близко не к универсально доступны пока).

1 голос
/ 07 июня 2010

Если у вас есть устройства Windows на обоих концах соединений, вы можете использовать Фоновую интеллектуальную службу передачи (BITS), чтобы переместить информацию и скопировать весь вопрос о пропускной способности.(Почти) всегда установленный компонент описан в http://msdn.microsoft.com/en-us/library/aa362708(VS.85).aspx.

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

0 голосов
/ 21 июня 2010

Один из вариантов - реализовать что-то вроде транспортного протокола UDP uTorrent между клиентом и сервером, чтобы снизить задержку. Простое измерение исходной пропускной способности не поможет, когда какой-то другой процесс также начнет использовать полосу пропускания, сокращая объем свободной полосы пропускания, который у вас есть.

0 голосов
/ 02 июня 2010

Если проблема в необработанной пропускной способности, то здесь может работать механизм обратной связи. Когда вы начинаете сеанс, сервер сообщает клиенту, с какой скоростью он будет отправлять данные. Клиент может отслеживать, с какой скоростью он получает данные. Если скорость для полученных данных меньше скорости отправки данных (вы можете использовать порог здесь, например, на 90% ниже или ниже), тогда клиент уведомляет сервер о снижении скорости передачи данных и снова запускает процесс. Это будет служить основным механизмом QoS.

Если проблема в том, что соединение имеет высокую задержку и / или дрожание, попробуйте отправить информацию в меньших пакетах (фактические пакеты IP / TCP). Обычно система пытается использовать максимальный размер пакета, но фрагментация пакетов в Интернете может задержать трафик. Если это все еще не улучшает задержку, вы можете использовать UDP вместо TCP. Но это не обеспечит доставку данных.

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

Единственные ответы, которые я вижу:

  1. Используйте небольшой образец для определения времени скорость передачи.
  2. Время фактических данных в кусках (скажем, 1k) и сообщить о среднем.

Некоторые из вопросов, осложняющих дело:

  • Полоса пропускания процессора отправляющая машина (т.е. другие задачи бег).
  • Плотность трафика в сети.
  • Задачи, выполняемые на клиентском компьютере.
  • Архитектура всех машин.

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

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

...