Без вмешательства ядро Linux по умолчанию склонно сажать обработку аппаратных прерываний (IRQ) от сетевой карты или диска на одно и то же ядро — обычно CPU0. На спокойном сервере это незаметно, но стоит сетевой карте начать принимать десятки тысяч пакетов в секунду, и это одно ядро упирается в потолок по %si (softirq) в top, пока остальные ядра простаивают. irqbalance — демон, который читает /proc/interrupts, смотрит на реальную загрузку по ядрам и перераспределяет назначения через /proc/irq/<N>/smp_affinity, не трогая при этом IRQ, явно забаненные через --banirq=<N>.

На большинстве дистрибутивов он уже установлен и запущен как systemd-сервис по умолчанию, работать с ним руками почти никогда не приходится — именно для этого он и существует, чтобы не писать maskи smp_affinity вручную под каждое изменение состава оборудования. Для разового прогона без постоянного демона есть флаг --oneshot: применить балансировку один раз и выйти, не оставляя процесс висеть в фоне.

Но на выделенных узлах с высокой сетевой нагрузкой — что-то вроде маршрутизатора, прокси или ноды с 10/25/100G сетевой картой с multi-queue и RSS — автоматика начинает мешать. irqbalance периодически пересматривает раскладку и может перекинуть очередь интерфейса на другое ядро прямо посреди теста производительности, разрушая локальность в кэше процессора (L2/L3), которую администратор специально выстроил под NUMA-топологию конкретной карты. В таких случаях типовая практика — остановить и отключить демон (systemctl disable --now irqbalance) и закрепить каждую очередь интерфейса за конкретным ядром вручную, записывая битовую маску напрямую в /proc/irq/<N>/smp_affinity (или smp_affinity_list с номерами ядер через запятую, что читается human-readable без перевода из hex). Ручная раскладка требует синхронизации с NUMA-узлом, к которому физически подключена карта — иначе прерывание обслуживается ядром с одного NUMA-узла, а пакет лежит в памяти другого, и выигрыш от ручной настройки съедается межсокетными обращениями к памяти.

Граница простая: для универсального сервера — доверять irqbalance и не трогать его. Для узла с известным, стабильным профилем нагрузки на конкретной сетевой карте — отключить демон и закрепить очереди руками один раз, с документированием, какое ядро за какой IRQ отвечает, чтобы следующий администратор не терялся при апгрейде сетевой карты.

#linux #sysadmin