2009-11-04 2 views
10

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

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

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

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

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

+0

Когда вы говорите «играет музыку», вы имеете в виду, что он играет музыку вашего HD и использует звуковую карту? Или это потоковая передача через ту же сетевую карту? – Toad

+0

@reinier: Да, foobar2000 медленно загружает данные с HD и потокового аудио на мой внешний аудиоинтерфейс через USB 2.0. –

ответ

3

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

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

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

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

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

0

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

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

+0

Я очень сомневаюсь, что проблема связана с foobar2000. Я попробую другие медиаплееры еще раз диагностировать проблему. Он * может иметь какое-то отношение к аудио-интерфейсу USB 2.0, который я использую. Я также проведу некоторые тесты с помощью встроенной звуковой карты. –

0

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

+0

Я должен упомянуть, что я использую протоколы TCP и UDP в одном приложении. TCP предназначен только для информации управления и координации всех клиентов; это не должно быть узким местом здесь. Я использую UDP исключительно для передачи данных и сохраняю пакеты менее 1500 байт. Я использовал все UDP, но столкнулся с серьезными проблемами синхронизации и собирался заново изобрести TCP-колесо, поэтому я сказал, почему не просто использовать TCP. –

+0

TCP/IP - это первое место, где я буду искать вашу проблему. –

+0

@Mike: Считаете ли вы, что потеря пакетов UDP на стороне сервера каким-то образом связана с передачей TCP-сообщений? TCP используется только для уведомления всех клиентов о том, что следующая партия данных будет отправлена ​​через UDP. Существует также сообщение «complete complete», которое отправляется после небольшой задержки с сервера. В то время как пакетная передача UDP на месте, нет сообщений TCP, отправляемых туда и обратно приложениями, кроме обычного потока трафика TCP, который ОС выполняет, чтобы сохранить установленное соединение. –

2

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

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

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

Не удалось найти ссылки на прямой поиск из Google. Тем не менее, вы можете увидеть концепцию в this discussion of network tuning for Linux или в this FAQ, которая описывает такие методы, как пакетная обработка для повышения пропускной способности.

+0

Я уже собираю пакеты в группах по 1024. Пакеты составляют около 1400 байт. Я получаю около 50-60 отрицательно подтвержденных пакетов клиентом из 1024. Когда я выключаю медиаплеер на серверной машине, количество NAK сразу снижается до 0 и достигается более высокая пропускная способность. Это, по-видимому, указывает на то, что сервер несет ответственность за потерю пакета. Мне интересно, что я могу сделать со стороны сервера, если вообще что-то, чтобы автоматически приспособиться к этому конфликту ввода-вывода. –

+0

Ваш комментарий: кажется, указывает на противоположность вашего вопроса. Вы действительно пытаетесь отправить 1024 пакета каждые 50-100 мкс? Это безумная пропускная способность. И действительно ли проблема - пропускная способность или потеря данных? –

+0

О нет. Задержка 50-100 микросекунд представляет собой задержку между отправкой отдельных пакетов в секторе пакетов 1024. Также я не верю, что упоминал о моей 50-100 микросекундной задержке в этом вопросе. Вы перекрестно ссылаетесь на мои вопросы SO? :) –

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