Лучшие практики высокопроизводительных сетевых приложений

При тестировании многоадресного UDP-сервера, который я написал для Windows 7 Ultimate x64, я наткнулся на очень любопытную вещь. Воспроизведение музыки с помощью foobar2000 в фоновом режиме значительно улучшило скорость передачи данных сервера, но также привело к незначительной потере пакетов. Выключение музыки сразу же снизило скорость передачи до ниже допустимого уровня, но также привело к нулевой потере пакетов. (У меня есть клиентское приложение, которое разговаривает с сервером и сообщает о неподтвержденных пакетах)

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

Что я могу сделать с точки зрения кода в моем серверном приложении, чтобы оно работало стабильно независимо от того, воспроизводит ли музыку музыку в Vista и более поздних версиях? Я определенно хотел бы избежать необходимости информировать всех моих клиентов о том, как настроить их реестр для получения приемлемых скоростей передачи, а также не хотел бы, чтобы они просто «проигрывали музыку», чтобы также получить приемлемые скорости передачи. На мой взгляд, приложение должно «просто работать».

Я думаю, что решение включает в себя что-то вроде приоритетов процессов, MMCSS или, возможно, какой-то другой неясный вызов Windows API, чтобы заставить его делать The Right Thing (TM) здесь.

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


person James Dunne    schedule 04.11.2009    source источник
comment
когда вы говорите «играет музыку», вы имеете в виду, что он воспроизводит музыку с вашего HD и использует звуковую карту? Или это стриминг через ту же сетевую карту?   -  person Toad    schedule 04.11.2009
comment
@reinier: Да, foobar2000 медленно загружает данные с HD и передает аудио на мой внешний аудиоинтерфейс через USB 2.0.   -  person James Dunne    schedule 04.11.2009


Ответы (4)


То, что вы наблюдаете, является побочным эффектом того, что ваш медиаплеер устанавливает тактовое разрешение вашего компьютера на 1 мс.

Это происходит только во время игры

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

Чтобы проверить это, вы можете просто установить разрешение таймера в своем приложении на 1 мс и сравнить производительность без воспроизведения мультимедиа.

Должно быть так же, как и без настройки clocres, но с воспроизведением мультимедиа.

person Boppity Bop    schedule 23.06.2010

Прошло много лет с тех пор, как я написал код, связанный с сетевым протоколом, но я предложу предположение.

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

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

Я не смог найти прямых релевантных ссылок с помощью быстрого поиска в Google. Однако вы можете увидеть эту концепцию в этом обсуждении настройки сети для Linux или в этом FAQ, где описаны такие методы, как пакетирование для повышения пропускной способности.

person g .    schedule 08.11.2009
comment
Я уже группирую пакеты в группы по 1024. Пакеты имеют размер около 1400 байт каждый. Я получаю около 50-60 пакетов с отрицательным подтверждением из 1024. Когда я выключаю медиаплеер на сервере, счетчик NAK сразу же падает до 0 и достигается лучшая пропускная способность. Похоже, это указывает на то, что сервер несет ответственность за потерю пакетов. Мне интересно, что я могу сделать со стороны сервера, если что-нибудь, чтобы автоматически приспособиться к этому конфликту ввода-вывода. - person James Dunne; 09.11.2009
comment
Ваш комментарий, кажется, указывает на противоположное вашему вопросу. Вы действительно пытаетесь отправлять 1024 пакета каждые 50-100 мкс? Это безумная пропускная способность. И действительно ли проблема заключается в пропускной способности или в потере данных? - person g .; 10.11.2009
comment
О нет, нет. Задержка в 50–100 микросекунд - это задержка между отправкой отдельных пакетов в секторе из 1024 пакетов. Также я не думаю, что упомянул мою задержку в 50-100 микросекунд в этом вопросе. Вы ссылаетесь на мои вопросы SO? :) - person James Dunne; 10.11.2009

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

Надеюсь, идея поможет.

person Vasyl Boroviak    schedule 04.11.2009
comment
Я очень сомневаюсь, что проблема связана с foobar2000. Я попробую другие медиаплееры для дальнейшей диагностики проблемы. Это может иметь какое-то отношение к аудиоинтерфейсу USB 2.0, который я использую. Я также проведу несколько тестов со встроенной звуковой картой. - person James Dunne; 04.11.2009

Это похоже на управление пропускной способностью TSP / IP на основе его примитивного алгоритма. Белая книга здесь должна дать больше фона. http://www.asperasoft.com/?gclid=CICSzMqD8Z0CFShGagod_ltSMQ Их продукт - UDP протокол, который работает очень хорошо.

person Mike Trader    schedule 04.11.2009
comment
Следует отметить, что я использую протоколы TCP и UDP в одном приложении. TCP предназначен только для управления информацией и координации всех клиентов; здесь не должно быть узкого места. Я использую UDP исключительно для передачи данных и храню пакеты размером менее 1500 байт. Я использовал весь UDP, но столкнулся с серьезными проблемами синхронизации и собирался заново изобрести колесо TCP, поэтому я сказал, почему бы просто не использовать TCP. - person James Dunne; 04.11.2009
comment
TCP / IP - это первое место, где я могу найти вашу проблему. - person Mike Trader; 04.11.2009
comment
@Mike: Как вы думаете, потеря пакетов UDP на стороне сервера как-то связана с происходящим TCP-соединением? TCP используется только для уведомления всех клиентов о том, что следующий пакет данных будет отправлен через UDP. Также есть сообщение «сектор завершен», которое отправляется сервером после небольшой задержки. Пока выполняется пакетная передача UDP, приложение не отправляет TCP-сообщения туда и обратно, за исключением обычного потока TCP-трафика, который ОС выполняет для поддержания соединения. - person James Dunne; 09.11.2009