CPU_IRQ_IMBALANCE
Linux / DevOps
Мониторинг прерываний процессора в Linux: /proc/interrupts и smp_affinity
- Одно из ядер CPU (обычно CPU0) загружено на 100% в режиме
%si(Software Interrupts) или%hi(Hardware Interrupts). - Дропы сетевых пакетов на сетевых интерфейсах (RX drops/overruns) при высокой сетевой нагрузке.
- Неравномерное распределение счетчиков прерываний в
/proc/interruptsмежду ядрами.
1. Анализ распределения аппаратных прерываний
watch -n 1 -d cat /proc/interruptsИли фильтрация по сетевым интерфейсам (например, eth0):
grep -E "CPU|eth0|mlx|ixgbe" /proc/interrupts2. Проверка и настройка демона irqbalance
# Установка и запуск демона
apt-get install -y irqbalance || dnf install -y irqbalance
systemctl enable --now irqbalanceИсключение изолированных ядер из балансировки в /etc/default/irqbalance:
IRQBALANCE_BANNED_CPUS="0000ff00"3. Ручная привязка IRQ через smp_affinity (для High-Load / Low-Latency)
Отключите irqbalance для целевых интерфейсов и задайте маску CPU напрямую (маска в hex-формате, например bitmask 2 = CPU1, 4 = CPU2):
# Определение номера IRQ для очереди eth0-rx-0
IRQ_NUM=$(grep "eth0-rx-0" /proc/interrupts | awk -F: '{print $1}' | tr -d ' ')
# Привязка к конкретному ядру CPU1 (маска 0x2)
echo 2 > /proc/irq/$IRQ_NUM/smp_affinity4. Включение многоочередевой обработки RPS/RFS
# Включение Receive Packet Steering на все ядра для eth0 (маска f = первые 4 ядра)
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
Практический опыт инженера:
Для сетевых адаптеров 10G/40G/100G с поддержкой RSS (Receive Side Scaling) настраивайте количество очередей сетевой карты равным количеству NUMA-узлов или физических ядер (ethtool -L eth0 combined N), избегая Hyper-Threading siblings.
Частые вопросы (FAQ)
Что означает smp_affinity_list вместо smp_affinity?
Файл smp_affinity принимает шестнадцатеричную битовую маску (hex), а smp_affinity_list принимает понятный список ядер через запятую или диапазон (например, '0-3,7').
Почему все прерывания по умолчанию идут на CPU0?
В старых версиях ядер или при отключенном irqbalance BIOS/ядро назначает обработчик прерывания на первичный загрузочный процессор (Boot Strap Processor, BSP).