自動將交換裝置繫結到 NUMA 節點

如果系統有多個交換裝置,且交換裝置包含節點資訊,我們可以利用這些資訊在 `get_swap_pages()` 中決定使用哪個交換裝置以獲得更好的效能。

如何使用此功能

交換裝置具有優先順序,這決定了它們的使用順序。為了利用自動繫結,無需操作交換裝置的優先順序設定。例如,在一個雙節點機器上,假設有兩個交換裝置 swapA 和 swapB,其中 swapA 連線到節點 0,swapB 連線到節點 1,它們將被啟用交換。簡單地啟用它們的方法是:

# swapon /dev/swapA
# swapon /dev/swapB

那麼節點 0 將以 swapA 然後 swapB 的順序使用這兩個交換裝置,而節點 1 將以 swapB 然後 swapA 的順序使用這兩個交換裝置。請注意,它們被啟用交換的順序無關緊要。

一個更復雜的例子,在一個四節點機器上。假設有 6 個交換裝置將被啟用交換:swapA 和 swapB 連線到節點 0,swapC 連線到節點 1,swapD 和 swapE 連線到節點 2,以及 swapF 連線到節點 3。啟用它們的方法與上述相同:

# swapon /dev/swapA
# swapon /dev/swapB
# swapon /dev/swapC
# swapon /dev/swapD
# swapon /dev/swapE
# swapon /dev/swapF

那麼節點 0 將按以下順序使用它們:

swapA/swapB -> swapC -> swapD -> swapE -> swapF

swapA 和 swapB 將在任何其他交換裝置之前以輪詢模式使用。

節點 1 將按以下順序使用它們:

swapC -> swapA -> swapB -> swapD -> swapE -> swapF

節點 2 將按以下順序使用它們:

swapD/swapE -> swapA -> swapB -> swapC -> swapF

類似地,swapD 和 swapE 將在任何其他交換裝置之前以輪詢模式使用。

節點 3 將按以下順序使用它們:

swapF -> swapA -> swapB -> swapC -> swapD -> swapE

實現細節

當前程式碼使用一個基於優先順序的列表 `swap_avail_list` 來決定使用哪個交換裝置,如果多個交換裝置共享相同的優先順序,它們將以輪詢方式使用。此處的變化是將單個全域性 `swap_avail_list` 替換為每個 NUMA 節點的列表,即對於每個 NUMA 節點,它都有自己基於優先順序的可用交換裝置列表。交換裝置的優先順序可以在其匹配節點的 `swap_avail_list` 上得到提升。

當前交換裝置的優先順序設定如下:使用者可以設定一個大於等於 0 的值,或者系統將從 -1 開始遞減選擇一個值。`swap_avail_list` 中的優先順序值是交換裝置優先順序的負值,因為 `plist` 是從低到高排序的。新策略不改變優先順序大於等於 0 情況的語義,之前從 -1 開始遞減的值現在變為從 -2 開始遞減,而 -1 被保留為提升值。因此,如果多個交換裝置連線到同一節點,它們在該節點的 `plist` 上都將被提升到優先順序 -1,並在任何其他交換裝置之前以輪詢方式使用。