linux irq balance and RT linux(中断线程化)

前段时间一个培训项目遇到了所有网卡中断都跑在一个核上,造成负载不均衡的问题,解决思路如下:


1. 首先查看一下

irqbalance service是否正常运行,自动平衡irq负载的service

2. 可以用下面命令绑定不同irq到不同的cpu上,smp_affinity为cpu的位掩码,3(0x11)代表0号和1号cpu

# service irqbalance stop

# echo "3" > /proc/irq/irqnum/smp_affinity


3. 在注册irq时,可以参考kernel函数 irq_set_affinity直接将irq绑定到指定的cpu

int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask)
{
    struct irq_desc *desc = irq_to_desc(irq);
    unsigned long flags;

    if (!desc->chip->set_affinity)
        return -EINVAL;
。。。
        if (!desc->chip->set_affinity(irq, cpumask)) {
。。。

        }

}


关于linux内核的实时性:

1. 实时性就是要求指定的任务可以在预期的时间内被处理,这在非实时的linux内核上没法保证,不论多么高优先级的实时任务都会被中断抢占,因此要保证实时就要把中断线程化,有其对应的优先级,将实时性要求高的任务的优先级设置为高于所有中断线程的优先级,那么该任务就不会被中断抢占。

2. 实现方法是:在注册irq时,如果没有设置IRQ_NODELAY标志,那么将为该irq创建一个内核线程,并可以设置线程的优先级范围为:25~50;在中断产生后,__do_irq将判断该中断是否已经线程化(flag:IRQ_NODELAY),没有线程化的中断在handle_irq_event中直接调用action->handler进行处理,已经线程化将wake_up_process(action->thread),唤醒该irq线程进行处理。

你可能感兴趣的:(中断管理)