自動將交換裝置繫結到 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,並在任何其他交換裝置之前以輪詢方式使用。