Что вызывает низкую производительность сети при воспроизведении аудио или видео в Windows Vista и новее? - PullRequest
4 голосов
/ 11 января 2011

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 12 января 2011

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

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

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

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

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

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

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

1 голос
/ 12 января 2011

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

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

...