Jump to content
Калькуляторы

Скрипт irqconf для linux

Сделал для себя, решил выложить. Позволяет указать вручную прерывания каких девайсов каким процессором должны обрабатываться. Конфигурация статическая. Процессоры нумеруются с нуля. Используется bash.

/usr/local/bin/irqconf:

#!/bin/bash

#
# Script for config SMP IRQ
# Config /etc/irq.conf
# IRQCONF example:
# IRQCONF="eth0=0,1 eth1=2,3"
#

# Change work dir
cd `dirname $0`;

# Check config
if [ ! -r /etc/irq.conf -a "$1" = "" ]; then
        echo "Config file or arguments not found!";
        exit 1;
fi

# Include config
if [ "$1" != "" ]; then
        IRQCONF=$1
else
        . /etc/irq.conf
fi

# Check var
if [ "$IRQCONF" = "" ]; then
        echo "Config is empty, nothing to do!";
        exit 0;
fi

# CPU nums
ncpus=`grep -ciw ^processor /proc/cpuinfo`;
maxcpu_no=$[$ncpus - 1];

# Handle config
for cvar in $IRQCONF; do
        dev=${cvar%%=*};
        cpus=${cvar#*=};
        irq=`cat /proc/interrupts | grep $dev | awk '{print $1}' | sed s/\://g`;

        if [ "$irq" = "" ]; then
                echo "Warn: IRQ number for dev='$dev' not found. Ignore!";
                continue;
        fi

        # Set new delimiter
        OLD_IFS=$IFS
        IFS=",";

        # For all dev CPUs
        mask=0;
        for cpu in $cpus; do
                if [ $cpu -gt $maxcpu_no ]; then
                        echo "Warn: CPU index '$cpu' greater than max cpu index '$maxcpu_no'. Ignore!";
                        continue;
                fi

                cpu_mask=$[2 ** $cpu];
                mask=$[$mask | $cpu_mask];
        done

        if [ $mask -gt 0 ]; then
                hex_mask=`printf %x $mask`;
                f="/proc/irq/$irq/smp_affinity";
                echo "$hex_mask" >"$f";
                res=$?;

                echo -n "Dev '$dev (irq=$irq)' assign smp affinity to CPUs '$cpus (0x$hex_mask)': ";
                [ "$res" = "0" ] && echo "OK" || echo "FAIL!";
        fi

        # Set default delimiter
        IFS=$OLDIFS
done

exit 0;

 

/etc/irq.conf

# Параметры конфигурации.
# Название устройства из /proc/interrupts или часть названия
# Номер процессора начинается с 0
IRQCONF="eth0-TxRx=0 eth1-TxRx=1 ide0=2 ahci=2 eth2=2 timer=3"

 

В качестве имени может использоваться паттерн для grep, например timer$=3.

Через запятую можно указать несколько процов, например timer=0,1

irqconf.tar.gz

Edited by SokolovS

Share this post


Link to post
Share on other sites
Уже есть такая штука: http://laas.mine.nu/jens/eth-affinity-1.2.3.tar.gz
Видел уже, она немного не то делает. Она из /proc/interrupts выдергивает только eth устройства и закрепляет прерывания за определенными процами. Другие уйтройства походу распределяются по какой то своей логике. У меня конфигурация задается статически. Ну и она походу не корректно работает с устройствами eth если там несколько очередей.

Я бы ее использовал если бы мне подошло.

Edited by SokolovS

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this