Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.3. 微調插斷與 IRQ

插斷請求(IRQ)是在硬體等級發送的服務請求。插斷可以由專職的硬體線、或橫跨硬體匯流排,以資訊封包(一種訊息插斷:MSI,Message Signaled Interrupt)的方式發出。
啟用插斷時,收到 IRQ 會提示一組開關發出插斷文本。kernel 插斷會發送程式碼,擷取 IRQ 的號碼及其相關的 ISR(插斷服務處理程式,Interrupt Service Routine),並依序呼叫每個 ISR。ISR 會確定插斷,忽略來自同樣 IRQ 的重複插斷,然後將延遲後的處理程式放入佇列中,以完成處理插斷,並避免 ISR 忽略未來的插斷。
/proc/interrupts 檔案會根據每個 CPU 及每個 I/O 裝置,列出插斷的數目。它會顯示 IRQ 編號、每個 CPU 核心處理的插斷數目、以及以逗號隔開的驅動程式清單(這驅動程式清單已註冊以收到該插斷)。(詳情請參閱 pro(5) 的 man page,指令為:man 5 proc。)
IRQ 有一組相關的「關聯」屬性:smp_affinity,這會定義允許為該 IRQ 執行 ISR 的 CPU 核心。這屬性可以透過指定插斷關聯與應用程式的執行續關聯,至一或多個指定的 CPU 核心,進而改善應用程式效能。這允許在特定的插斷與應用程式執行續之間,共享快取線。
特定 IRQ 編號的插斷關聯值儲存在相關的 /proc/irq/IRQ_NUMBER/smp_affinity 檔案裡,root 使用者可以加以檢視、修改。儲存在這檔案中的值是十進位的位元遮罩,表示系統上的所有 CPU 核心。
作為範例,要為一台有著四 CPU 核心的伺服器之乙太網路驅動程式設定插斷關聯,請先找出與該乙太網路驅動程式相關的 IRQ 編號:
# grep eth0 /proc/interrupts
32:   0     140      45       850264      PCI-MSI-edge      eth0
使用 IRQ 編號,找出正確的 smp_affinity 檔案:
# cat /proc/irq/32/smp_affinity 
f
smp_affinity 的預設值為 f,表示 IRQ 可以接受系統上任何 CPU 的服務。設定這個值為 1(如下所示)表示只有 CPU 0 可以服務此插斷:
# echo 1 >/proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
1
逗號可以用來加在多個 smp_affinity 的值之間,以分開 32 位元的群組。這在擁有超過 32 核心的系統上是必要的。例如以下範例就顯示,一台 64 核心系統上的所有核心都為 IRQ 40 提供服務:
# cat /proc/irq/40/smp_affinity
ffffffff,ffffffff
要只用 64 核心系統的前 32 個核心服務 IRQ 40,請使用以下指令:
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity
# cat /proc/irq/40/smp_affinity
ffffffff,00000000

注意

在支援「interrupt steering」(操縱插斷)的系統上,修改 IRQ 的 smp_affinity 會設定硬體,讓使用特定 CPU 來服務插斷的決定會在硬體等級上決定,不需要 kernel 干預。