自动将交换设备绑定到 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,并在任何其他交换设备之前以轮询方式使用。