Высокие задержки DPC Latency в ndis.sys: оптимизация сетевого стека
Симптомы высоких задержек DPC в драйвере ndis.sys
На высоконагруженных сетевых серверах (Hyper-V хосты, шлюзы, веб-серверы) наблюдаются микрофризы, падение пропускной способности сети и неравномерное распределение нагрузки между ядрами CPU (одно ядро загружено на 100%, остальные простаивают). Утилиты анализа задержек (LatencyMon, DPC Latency Checker) фиксируют задержки свыше 2000–5000 мкс в модуле ndis.sys и tcpip.sys.
| Симптом | Локация | Причина |
|---|---|---|
| LatencyMon: ndis.sys > 2000 µs | Ядро NDIS | Все входящие сетевые пакеты обрабатываются на одном ядре CPU (CPU0) |
| Потеря сетевых пакетов (Packet Drops) | Сетевой адаптер | Переполнение кольцевого буфера RX/TX (Ring Buffer) сетевой карты |
| Низкая скорость при 10/25/40GbE | Сетевой стек Windows | Отключена технология Receive Side Scaling (RSS) или Virtual Machine Queues (VMQ) |
Пошаговая оптимизация задержек NDIS и сетевых прерываний
- Включите и оптимизируйте технологию масштабирования на стороне приема (RSS): распределите сетевые прерывания по разным ядрам процессора:
Enable-NetAdapterRss -Name "*"; Set-NetAdapterRss -Name "Ethernet1" -BaseProcessorGroup 0 -BaseProcessorNumber 2 -MaxProcessorNumber 16 -NumberOfReceiveQueues 8 -Profile NUMAScaling - Увеличьте размеры очередей приема и передачи (Rx/Tx Buffers) сетевой карты:
Set-NetAdapterAdvancedProperty -Name "Ethernet1" -DisplayName "*Receive Buffers*" -RegistryValue 2048; Set-NetAdapterAdvancedProperty -Name "Ethernet1" -DisplayName "*Transmit Buffers*" -RegistryValue 2048 - Отключите объединение прерываний (Interrupt Moderation) при требованиях к ультра-низким задержкам:
Set-NetAdapterAdvancedProperty -Name "Ethernet1" -DisplayName "*Interrupt Moderation*" -RegistryValue 0 - Проверьте текущее распределение прерываний по процессорам:
Get-NetAdapterRss | Format-List Name, Enabled, Profile, BaseProcessorNumber, MaxProcessorNumber
Важно: Не назначайте BaseProcessorNumber = 0 на серверах с высокой нагрузкой, так как ядро CPU0 уже занято системными задачами операционной системы.
Частые вопросы (FAQ)
Что такое драйвер ndis.sys?
NDIS (Network Driver Interface Specification) — это системный драйвер ядра Windows, являющийся мостом между сетевыми протоколами (TCP/IP) и драйверами физических сетевых карт.
Чем отличаются прерывания ISR от DPC?
ISR (Interrupt Service Routine) — это быстрый аппаратный сигнал процессору о событии. DPC (Deferred Procedure Call) — отложенная процедура для длительной обработки переданных данных.
Как профиль NUMAScaling помогает снизить DPC задержки?
Профиль NUMAScaling гарантирует, что обработка сетевых пакетов происходит на том же сокете CPU (NUMA-ноде), к которому аппаратно подключена сетевая карта через шину PCI-E.
Может ли включенный VMQ вызывать задержки на 1Gbps картах?
Да, на медленных гигабитных контроллерах драйверная реализация VMQ часто содержит баги. На адаптерах 1Gbps рекомендуется отключать VMQ.