Настройка системных прерываний

    Запрос прерывания (или IRQ ) - это аппаратный сигнал, посылаемый процессору, который временно останавливает работающую программу и позволяет вместо этого запускать специальную программу - обработчик прерываний . Аппаратные прерывания используются для обработки таких событий, как получение данных от DVB или сетевой карты , нажатие клавиш или движения мыши.

    Для оптимизации загрузки ЦП рекомендуется настроить CPU affinity для IRQ.
    Информация об прерываний в находится в файле /proc/interrupts. Формат файла:

               CPU0       CPU1       CPU2       CPU3
    ...
     45:          0          0          0          0   PCI-MSI-edge      eth0
     46:          0          0          0          0   PCI-MSI-edge      eth0-rx-0
     47:          0          0          0          0   PCI-MSI-edge      eth0-rx-1
     48:          0          0          0          0   PCI-MSI-edge      eth0-rx-2
     49:          0          0          0          0   PCI-MSI-edge      eth0-rx-3
     50:          0          0          0          0   PCI-MSI-edge      eth0-tx-0
     51:          0          0          0          0   PCI-MSI-edge      eth0-tx-1
     52:          0          0          0          0   PCI-MSI-edge      eth0-tx-2
     53:          0          0          0          0   PCI-MSI-edge      eth0-tx-3
    
    • Первый столбец-номер IRQ.
    • CPU0 .. CPUx является счетчиком прерываний - так-же, каким ядром процессора обрабатывается прерывание.
    • PCI-MSI-edge это тип IRQ
    • Последний столбец-это имя устройства

    Чтобы назначить прерывание на определённое ядро необходимо прописать его номер в файле /proc/irq/[IRQ Number]/smp_affinity:

    echo [smp_affinity value] >/proc/irq/[IRQ Number]/smp_affinity
    

    Калькулятор SMP Affinity:

    SMP Affinity Value:  

    Для применения параметров smp_affinity при запуске системы необходимо добавить их в файл /etc/rc.local (пример):

    # CPU0
    echo 1 >/proc/irq/45/smp_affinity
    echo 1 >/proc/irq/46/smp_affinity
    echo 1 >/proc/irq/47/smp_affinity
    # CPU1
    echo 2 >/proc/irq/48/smp_affinity
    echo 2 >/proc/irq/49/smp_affinity
    # CPU2
    echo 4 >/proc/irq/50/smp_affinity
    echo 4 >/proc/irq/51/smp_affinity
    # CPU3
    echo 8 >/proc/irq/52/smp_affinity
    echo 8 >/proc/irq/53/smp_affinity
    

    скрипт который распределяет прерывания в автоматическом режиме.

    Для правильной работы - скрипт необходимо запускать при старте системы

    #!/bin/bash
    service irqbalance stop
    
    ncpus=`grep -ciw ^processor /proc/cpuinfo`
    test "$ncpus" -gt 1 || exit 1
    n=0
    
    for irq in `cat /proc/interrupts | grep 'tbsecp3\|eth\|ddbridge\|eno\|ens' | awk '{print $1}' | sed s/\://g` ; do
        f="/proc/irq/$irq/smp_affinity"
        test -r "$f" || continue
        cpu=$[$ncpus - ($n % $ncpus) - 1]
        if [ $cpu -ge 0 ] ; then
            mask=`printf %x $[2 ** $cpu]`
            echo "Assign SMP affinity: dev$n, irq $irq, cpu $cpu, mask 0x$mask"
            echo "$mask" > "$f"
            let n+=1
        fi
    done