Воспроизведение мультимедиа и пропускная способность сети в ОС Windows Vista
Несколько недель назад пользователь форума 2CPU под псевдонимом dloneranger сообщил о том, что в его системе, работающей под управлением ОС Windows Vista, во время воспроизведения звуковых файлов и видеороликов наблюдается снижение пропускной способности сети. Это сообщение подтвердили другие пользователи, а на прошлой неделе такое поведение операционной системы обсуждалось на других веб-узлах, среди которых - Slashdot и Zdnet (точнее, блоггер Эдриан Кингсли-Хьюз (Adrian Kingsley-Hughes)).
Многие пользователи сделали верное предположение о том, что снижение производительности сети при воспроизведении мультимедиа напрямую связано с механизмами, которые реализуются службой планировщика классов мультимедиа (Multimedia Class Scheduler Service, MMCSS). Об этой службе, впервые появившейся в ОС Windows Vista, я рассказываю в своей трехчастной серии статей в журнале TechNet Magazine, посвященной изменениям в ядре Windows Vista. Для воспроизведения мультимедийных данных требуется постоянная скорость потоковой передачи данных, в противном случае сбоев не избежать. Служба MMCSS, исполняемая в универсальном процессе размещения служб Svchost.exe, автоматически выполняет приоритезацию воспроизведения видео и звуковых данных, не допуская предоставления другим задачам необходимых воспроизводящему ПО ресурсов процессора.
Когда приложение начинает воспроизведение, мультимедийные API-интерфейсы, которые оно задействует, вызывают службу MMCSS, чтобы присвоить потоку воспроизведения приоритет реального времени. К этой категории относятся приоритеты в диапазоне от 16 до 31. Приоритет должен оставаться в этом диапазоне до 8 мс из каждых 10, в зависимости от уровня потребления потоком воспроизведения ресурсов процессора. Поскольку все прочие потоки при этом исполняются в диапазоне динамических приоритетов до 15, то даже приложения с наиболее интенсивным потреблением ресурсов процессора не оказывают негативного воздействия на воспроизведение.
Чтобы увидеть резкое повышение приоритета, можно воспроизвести звуковой файл или видеоролик в проигрывателе Windows Media (WMP), открыть монитор производительности и стабильности, выбрав Start > Run > Perfmon (Пуск > Выполнить > Perfmon), перейти к монитору производительности (пункт Performance Monitor) и добавить значение Priority Current (Текущий приоритет) для всех потоков Wmplayer в объекте Thread. Доведите масштаб шкалы до 31 (это максимальный приоритет в ОС Windows), и повышение приоритета станет наглядным (на следующем рисунке экрана показан поток, которому изначально присвоен приоритет 21).
На воспроизведение мультимедиа влияют не только другие потоки, но и сетевая активность. Когда в систему поступает сетевой пакет, происходит прерывание ЦП, в связи с чем драйвер устройства, выступающего получателем пакета, выполняет программу служебных прерываний (Interrupt Service Routine, ISR). Во время выполнения ISR прерывания от других устройств блокируются, поэтому, как правило, после учета устройств длительная исходящая или входящая передача данных с участием устройства, вызвавшего прерывание, осуществляется путем отложенных вызовов процедур (Deferred Procedure Call, DPC) с разрешенными прерываниями. Отложенные вызовы процедур с разрешенными прерываниями в контексте процессора, в котором они исполняются, считаются приоритетными по отношению к любым потокам, вне зависимости от и их приоритета. За счет этого они могут становиться помехой потокам воспроизведения мультимедиа.
Обработка входящих сетевых пакетов путем DPC - это одна из наиболее ресурсоемких операций, поскольку она подразумевает передачу пакетов драйверу TCP/IP, которая может быть связана с длительными вычислениями. Драйвер TCP/IP проводит проверку каждого пакета, определяет протокол, по которому тот передан, обновляет состояние подключения, находит принимающее приложение и копирует полученные данные в его буферы. На следующем снимке экрана программы Process Explorer видно, как сильно за счет отложенных вызовов процедур возрастает потребление ресурсов процессора при копировании крупного файла из другой системы.
Тестирование службы MMCSS во время разработки ОС Windows Vista показало, что даже при условии повышения приоритета потока сетевой трафик в большом объеме может инициировать такое количество вызовов DPC, из-за которого потоки воспроизведения теряют скорость потоковой передачи данных, что неизменно приводит к сбоям воспроизведения. Таким образом, реализованные в службе MMCSS механизмы бессбойного воспроизведения были расширены в расчете на регулировку сетевой активности. Для этого драйверу устройства NDIS, который передает принятые сетевым адаптером пакеты драйверу TCP/IP, подается специальная команда, заставляющая NDIS передавать не более 10 пакетов за миллисекунду (что соответствует 10 000 пакетов в секунду).
Поскольку стандартный размер кадра Ethernet составляет 1500 байт, предел в 10 000 пакетов в секунду эквивалентен максимальной пропускной способности 15 Мбайт/с. Сети стандарта 100 Мбит обеспечивают пропускную способность в районе 12Мбайт/с, поэтому в таких сетях падение этого параметра обычно не заметно. В то же время, при передаче данных в рамках сети 1 Гб между системами с сетевыми адаптерами 1Гб пропускная способность уменьшится примерно на 85%.
Помимо прочего, в коде регулировки сетевой активности драйвера NDIS была допущена досадная ошибка, которая при наличии нескольких сетевых карт усугубляет проблему. Если, к примеру, в системе одновременно установлены адаптеры проводной и беспроводной сети, то NDIS сможет обрабатывать не более 8000 пакетов в секунду, а при наличии трех адаптеров - не более 6000 пакетов. Передача 6000 пакетов в секунду соответствует пропускной способности 9 Мбайт/с, а значит, в такой ситуации падение производительности ощущается даже в сетях 100 Мбит.
Падение пропускной способности наглядно проявилось на моем портативном компьютере с тремя сетевыми картами, когда я начал копирование объемного файла с другой системы, а затем запустил воспроизведение звукового файла в проигрывателе WMP. На снимке экрана диспетчера задач, показанном ниже, хорошо видно, как исходный уровень пропускной способности 20%, достигаемый при копировании в сети 1 Гбит, падает до 6% после начала воспроизведения звукового файла.
Чтобы отследить число входящих пакетов, обработанных драйвером NDIS, достаточно добавить в представление системного монитора счетчик "packets received per second" (число полученных пакетов в секунду) объекта Network (Сеть). На следующей иллюстрации прослеживается динамика числа входящих пакетов в ходе моего эксперимента. Стоит заметить, что число пакетов, обработанных драйвером NDIS, не достигает теоретического максимума в 6 000 пакетов в секунду. По-видимому, это связано с синхронизацией с удаленной системой.
Что же касается Интернет-трафика, то он не пострадает от подобной регулировки даже при самом высокоскоростном подключении. Дело в том, что многочисленные промежуточные соединения между локальной и удаленной системами в Интернете приводят к фрагментации пакетов и замедлению их передачи, а следовательно, снижают конечную скорость обмена данными между системами.
Величины регулировки полосы пропускания, применяемые в ОС Windows Vista, выбраны путем экспериментов, в ходе которых были достигнуты надежные показатели бессбойного воспроизведения в системах с одним ЦП, подключенных к сетям 100 Мбит с высокой интенсивностью приема пакетов. Жесткое ограничение, связанное с регулировкой, оказалось непредусмотрительным шагом в контексте появления современных компьютеров с быстрыми многоядерными процессорами и гигабитными сетевыми адаптерами. Сегодня разработчики корпорации Майкрософт, занимающиеся сетевыми технологиями, не только устраняют ошибку регулировки в системах с несколькими сетевыми картами, но также путем активного сотрудничества с группой разработки службы MMCSS пытаются снизить воздействие ее работы на сетевой трафик, сохраняя при этом бессбойное воспроизведение.
При появлении новых сведений на эту животрепещущую тему я обязательно сообщу их в блоге, так что следите за новыми записями!