CPU中斷綁定——計算 SMP IRQ Affinity

計算 SMP IRQ Affinity

前天咱們討論瞭如何綁定特定的硬件中斷到特定的 CPU 上,分散和平衡各個中斷到不一樣的 CPU 上以獲取更大性能的處理能力。上篇限於篇幅的關係,沒有來得及進一步說明 「echo 2 > /proc/irq/90/smp_affinity」 中的 」2「 是怎麼來的,這實際上是個二進制數字,表明 00000010,00000001 表明 CPU0 的話,00000010 就表明 CPU1, 「echo 2 > /proc/irq/90/smp_affinity」 的意思就是說把 90 中斷綁定到 00000010(CPU1)上。因此各個 CPU 用二進制和十六進制表示就是:post

               Binary       Hex 
    CPU 0    00000001         1 
    CPU 1    00000010         2
    CPU 2    00000100         4
    CPU 3    00001000         8

若是我想把 IRQ 綁定到 CPU2 上就是 00000100=4:性能

# echo "4" > /proc/irq/90/smp_affinity

若是我想把 IRQ 同時平衡到 CPU0 和 CPU2 上就是 00000001+00000100=00000101=5spa

# echo "5" > /proc/irq/90/smp_affinity

須要注意的是,在手動綁定 IRQ 到 CPU 以前須要先停掉 irqbalance 這個服務,irqbalance 是個服務進程、是用來自動綁定和平衡 IRQ 的:code

# /etc/init.d/irqbalance stop

還有一個限制就是,IO-APIC 有兩種工做模式:logic 和 physical,在 logic 模式下 IO-APIC 能夠同時分佈同一種 IO 中斷到8顆 CPU (core) 上(受到 bitmask 寄存器的限制,由於 bitmask 只有8位長。);在 physical 模式下不能同時分佈同一中斷到不一樣 CPU 上,好比,不能讓 eth0 中斷同時由 CPU0 和 CPU1 處理,這個時候只能定位 eth0 到 CPU0、eth1 到 CPU1,也就是說 eth0 中斷不能像 logic 模式那樣能夠同時由多個 CPU 處理。orm

相關文章
相關標籤/搜索