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線程進行處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章