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

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

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

Что я могу сделать с точки зрения кода в моем серверном приложении, чтобы оно работало стабильно, независимо от того, воспроизводится ли музыка в Vista и выше? Я, конечно же, хотел бы не сообщать всем своим клиентам о том, как настроить их реестр, чтобы получить приемлемые скорости передачи, а также хотел бы избегать того, чтобы они просто "играли музыку", чтобы получить приемлемые скорости передачи. Приложение должно "просто работать" на мой взгляд.

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам