Kernel

確定哪個 CPU 處理 Linux 核心中的哪個中斷的策略是什麼?

  • June 22, 2019

我一直在閱讀Linux Kernel Development,有些東西對我來說並不完全清楚——當硬體觸發中斷時,決定哪個 CPU 執行中斷處理邏輯的標準是什麼?

我可以想像它必須始終是引發 IO 請求的同一個 CPU,但由於執行緒用於所有目的,現在處於休眠狀態,這樣做並沒有那麼大的意義。

另一方面,可能需要引發定時中斷(例如,對於調度程序)。在 SMP 系統上,它們總是在同一個核心(比如說,#0)上提出,還是幾乎總是在任何核心上提出?

它實際上是如何工作的?

謝謝

在多處理器/多核系統上,您可能會發現一個名為irqbalance. 它的工作是調整硬體中斷在處理器之間的分佈。

在啟動時,當韌體將系統控制權交給核心時,最初只有一個 CPU 核心在執行。在初始化系統和啟動其他 CPU 核心之前,第一個核心(通常是核心 #0,有時稱為“monarch CPU/核心”)最初從韌體接管所有中斷處理職責。因此,如果不採取任何措施來分配負載,則最初啟動系統的核心最終會承擔所有中斷處理職責。

https://www.kernel.org/doc/Documentation/IRQ-affinity.txt建議在現代核心上,預設情況下允許所有 CPU 核心平等地處理 IRQ。但這可能不是最佳解決方案,因為它可能導致例如 CPU 高速記憶體行與頻繁的 IRQ 源的低效使用。這是irqbalance解決這個問題的工作。

irqbalance不是核心程序:它是一個獨立的二進製文件/usr/sbin/irqbalance,可以在單次模式下執行(即,作為引導過程的一部分調整中斷分佈一次,然後退出)或作為守護程序執行。不同的 Linux 發行版可以選擇以不同的方式使用它,或者完全忽略它。它允許通過簡單地更新使用者空間二進製文件來輕鬆測試和實現任意複雜的策略,以將 IRQ 分配給處理器。

它通過使用 per-IRQ/proc/irq/%i/smp_affinity文件來控制每個 CPU 可以處理哪些 IRQ。如果您對細節感興趣,請查看原始碼irqbalance:IRQ 設置的實際分配發生在activate.c.

引用自:https://unix.stackexchange.com/questions/516115