自动将交换设备绑定到 numa 节点

如果系统有多个交换设备,并且交换设备具有节点信息,我们可以利用此信息来决定在 get_swap_pages() 中使用哪个交换设备以获得更好的性能。

如何使用此特性

交换设备具有优先级,它决定了使用的顺序。为了利用自动绑定,无需操作交换设备的优先级设置。例如,在 2 个节点的机器上,假设 2 个交换设备 swapA 和 swapB,其中 swapA 连接到节点 0,swapB 连接到节点 1,将被交换到。只需通过执行以下操作即可将它们交换到:

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

然后,节点 0 将按 swapA 然后 swapB 的顺序使用这两个交换设备,节点 1 将按 swapB 然后 swapA 的顺序使用这两个交换设备。请注意,它们被交换的顺序无关紧要。

一个更复杂的例子,在一个 4 节点的机器上。假设 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,并将以循环模式使用,在任何其他交换设备之前。