前段時間一個培訓項目遇到了所有網卡中斷都跑在一個核上,造成負載不均衡的問題,解決思路如下:
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線程進行處理。