2011-01-11 6 views
4

Данное программное обеспечение является родным приложением C++/MFC, которое получает большой объем данных по UDP, а затем обрабатывает данные для отображения, вывода звука и записи на диск между прочим. Сначала я столкнулся с проблемой, когда документ справки CHM приложения был запущен из меню справки, а затем я щелкнул по документу справки при сборе данных с аппаратного обеспечения. Чтобы воспроизвести это, сценарий AutoHotkey был использован для быстрого нажатия в справочном документе во время работы приложения. Как только в системе произошел какой-либо звук, я начал получать ошибки.Что приводит к низкой производительности сети при воспроизведении аудио или видео в Windows Vista и новее?

Если у меня звуковая карта полностью отключена, все работает нормально, без ошибок, хотя выход звука явно отключен. Однако, если у меня есть звуковая игра (в этом приложении, другом приложении или даже просто звуковой сигнал из окна сообщения), я получаю тысячи отброшенных пакетов (мы знаем это, потому что каждый пакет имеет временную метку). В качестве второго теста я вообще не использовал свое приложение и просто использовал Wireshark для контроля входящих пакетов с аппаратного обеспечения. Разумеется, всякий раз, когда звук воспроизводился в Windows, мы отбрасывали пакеты. Фактически, звук не должен даже активно воспроизводиться, чтобы вызвать ошибку. Если я просто создаю буфер (используя DirectSound8) и никогда не начну играть, я все равно получаю эти ошибки.

Это происходит на нескольких ПК с несколькими комбинациями сетевых карт (как волоконно-оптических, так и RJ45) и звуковых карт (как интегрированных, так и отдельных карт). Я также пробовал разные версии драйверов для каждой сетевой платы и звуковой карты. Все тесты были на Windows 7 32bit. Поскольку мое приложение использует DirectSound для аудио, я пробовал разные CooperativeLevels (нормальная работа DSSCL_PRIORITY) без успеха.

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

+1

Известно, что Microsoft построила в ядре Windows Vista некоторые странные функции защиты, которые предотвращают ухудшение производительности ввода-вывода, чтобы убедиться, что мультимедийные приложения (Windows Media Player, directX) получают 100% -ную отзывчивость. Я не знаю, означает ли это также потерю пакетов с UDP. Прочитайте это хромое обоснование для метода: http://blogs.technet.com/b/markrussinovich/archive/2007/08/27/1833290.aspx Один из комментариев объясняет это довольно хорошо: «Кажется, Microsoft пыталась», исправить "то, что не было нарушено". – ypnos

+0

Вы знаете, что это проблема с UDP, правильно? Это ненадежный способ доставки, поэтому проверка ошибок должна быть включена в протокол, внешний по отношению к UDP. Или просто используйте TCP. «Кроме того, у вас есть информация, представленная ypnos - к которой у меня нет видимости/видимости) – KevinDTimm

+0

@KevinDTimm - Я знаю, что UDP по определению является ненадежным. Поскольку он работает без ошибок неограниченно в отсутствие звука (и у меня нет никакого способа изменить аппаратное обеспечение), я ищу решения проблемы, вызванной звуком. ypnos дал хорошую отправную точку, теперь, чтобы найти обходной путь. – bsruth

ответ

1

Известно, что Microsoft построила в ядре Windows Vista какую-то странную анти-функцию, которая предотвратит ухудшение производительности ввода-вывода, чтобы убедиться, что мультимедийные приложения (Windows Media Player, directX) получают 100% -ную отзывчивость. Я не знаю, означает ли это также потерю пакетов с UDP. Прочитайте это хроническое обоснование для метода: http://blogs.technet.com/b/markrussinovich/archive/2007/08/27/1833290.aspx

Один из комментариев здесь достаточно хорошо описывает это: «Кажется, Microsoft пыталась« исправить »что-то, что не было нарушено».

+1

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

+0

@Larry Osterman - Так я и делаю правильный способ решить эту проблему? Требуется ли регулирование сети, необходимое для текущего оборудования? – bsruth

+0

@bsruth: Я не уверен.Я просто комментировал комментарий ypnos, что что-то не сломалось. Многое зависит от вашей сетевой карты - некоторые сетевые карты (особенно гигабитные карты) анализируют элементы протокола на карте перед передачей их в ОС. Другие полагаются на ОС для анализа всего протокола. Сетевой стек пытается очень сильно не потреблять слишком много времени на стене при обработке входящих пакетов, если видит, что он занимает слишком много времени, он может опустить их на пол. Одна вещь, о которой вы не упоминали, это то, насколько велики UDP-пакеты - требуется ли им больше одного TSDU? –

6

Оказалось, что это по дизайну. В Windows Vista и более поздних версиях реализовано что-то, называемое Multimedia Class Scheduler service (MMCSS), которое предназначено для максимально гладкого воспроизведения мультимедиа. Поскольку воспроизведение мультимедиа зависит от аппаратных прерываний, чтобы обеспечить плавное воспроизведение, любые конкурирующие прерывания вызовут проблемы. Одним из основных источников аппаратного прерывания является сетевой трафик. Из-за этого Microsoft решила отключить сетевой трафик при запуске программы в рамках MMCSS.

Я думаю, это было big deal назад in 2007, когда Vista came out, но я пропустил его. Была статья Марка Руссиновича (спасибо ypnos) describing MMCSS. Кажется, что вся моя проблема сводилась к следующему:

Поскольку стандарт кадра Ethernet размер составляет около 1500 байт, предел 10000 пакетов в секунду равняется максимальную пропускную способность примерно 15MB/с. Сети 100 Мб могут обрабатывать не более 12 МБ/с, поэтому, если ваша система находится в сети 100 Мбит , вы, как правило, не увидите любого замедления. Однако, если у вас есть сетевая инфраструктура 1Gb и , система отправки и ваша система приема Vista имеют 1Gb-сеть адаптеров, вы увидите пропускную способность примерно до 15%. Кроме того, есть неудачная ошибка в коде NDIS , которая увеличивает дросселирование, если у вас есть несколько сетевых адаптеров.Если у вас есть системы с проводными и беспроводными адаптерами , например, NDIS будет процесса в большинстве 8000 пакетов в секунду , и с тремя адаптерами он будет обрабатывать максимум 6000 пакетов в секунду. 6000 пакетов в секунду равно 9 МБ/с, предел, который виден , даже в сетях 100 Мб.

Я еще не подтвердил, что ошибка множественного адаптера по-прежнему существует в Windows 7 или Vista SP1, но это то, что нужно искать, если у вас возникают проблемы.

Из комментариев к сообщению Руссиновича я обнаружил, что Vista SP1 представила некоторые параметры реестра, которые позволили настроить, как MMCSS влияет на Windows. В частности, NetworkThrottlingIndex key.

Решение моей проблемы состояло в том, чтобы полностью отключить дросселирование сети, установив ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex на 0xFFFFFFFF, а затем перезагрузив компьютер. Это полностью отключает часть дросселирования сети MMCSS. Я попытался просто увеличить значение до 70, но он не прекратил вызывать ошибки, пока я полностью не отключил его.

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

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

  • Нет связанных вопросов^_^