У нас есть приложение, которое отправляет и принимает большой сетевой трафик, но из-за прерываний мы получаем производительность ниже максимальной. При 20 Мбит / с на входе и 20 Мбит / с на выходе (на линии 1 Гбит / с) сетевые прерывания используют 100% ядра 0, и операционная система «зависает» (проверено с помощью анализатора производительности Windows). Использование функции RSS на сетевой карте (BroadCom) не улучшило ситуацию.
Я понимаю, что вы можете редактировать сходство определенных прерываний через реестр - моя цель - использовать второе ядро для сетевых прерываний, как я бы сделал в Linux, - но не знаю, как найти правильный ключ для редактирования. Любой другой совет очень приветствуется.
Я дам частичный ответ с подсказками о том, как и где, я полагаю, вы можете найти конкретный ответ, относящийся к вашей системе.
Функция сильно привязана к NDIS
версия операционной системы.
Ранняя ссылка - это ПроцессорAffinityMask параметр HKLM\SYSTEM\CurrentControlSet\Services\NDIS\Parameters
ключ. Он устанавливает, какие процессоры должны быть доступны для обслуживания прерываний драйвера сетевого адаптера в Windows 2000.
В Receive Side Scaling
подсистема развивалась в более поздних версиях, чтобы отображать очереди сетевой обработки на доступные процессоры, описанные Вот для Windows 2008.
Вот это документация для RSS
в Windows 2012 R2 (я полагаю, NDIS 6.40), и подсказка дается в первой фразе:
Для эффективной обработки полученных данных функция обслуживания прерывания приема драйвера минипорта планирует отложенный вызов процедуры (DPC). Без RSS типичный DPC указывает все полученные данные в вызове DPC. Следовательно, вся обработка приема, связанная с прерыванием, выполняется на ЦП, где происходит прерывание приема.
В конце эта ссылка ссылка на справочные материалы для всех 6.x NDIS
версии. Я считаю, что вы можете использовать эти ссылки, чтобы выработать ответ для вашей конкретной системы, а также определить точные термины, с которыми Google не может определить двусмысленность.
Что я вижу в документации, основываясь только на информации, содержащейся в вопросе (которая не слишком подробна)?
Первый процессор в наборе процессоров, который будет доступен для RSS
устанавливается с помощью HKEY_LOCAL_MACHINE\\SYSTEM\CurrentControlSet\Services\NDIS\Parameters\RssBaseCpu
параметр в Windows 2008, как описано Вот. Надеюсь, это справедливо и для Windows 2012 R2.
Точно так же максимальное количество процессоров, доступных для RSS
устанавливается с помощью HKEY_LOCAL_MACHINE\\SYSTEM\CurrentControlSet\Services\Ndis\Parameters\MaxNumRssCpus
как описано Вот.
Учитывая это, в Win2008 и, надеюсь, также в Win2012, установка RssBaseCpu
к 1 и MaxNumRssCpus
к 1 следует заблокировать RSS
обработка ко второму логическому процессору и никакому другому, предполагая RSS
был успешно активирован. RSS
Статус можно проверить из Windows через административную командную строку, например:
netsh int tcp show global
как задокументировано Вот.
Учитывая этот контекст, вполне возможно, что ваша проблема просто связана с плохо написанным драйвером устройства сетевой карты. У меня было довольно много проблем с механизмами разгрузки сетевых адаптеров (общая категория, к которой принадлежит RSS), особенно с интегрированными сетевыми адаптерами Broadcom на серверах Dell и соответствующими драйверами. Я бы посоветовал вам также рассмотреть эту возможность, если система не будет работать так, как можно было бы ожидать на основе конфигурации с четырехкратной проверкой.