dm-service-time

dm-service-time 是设备映射器目标的路径选择器模块,它选择具有最短估计服务时间的路径来处理传入的 I/O。

每个路径的服务时间通过将路径上正在进行的 I/O 的总大小除以该路径的性能值来估算。性能值是路径组中所有路径之间的相对吞吐量值,可以指定为表参数。

路径选择器名称为 ‘service-time’。

每个路径的表参数

[<repeat_count> [<relative_throughput>]]
<repeat_count>

在使用选定路径切换到下一路径之前,要使用选定路径分派的 I/O 数量。 如果未给出,则使用内部默认值。 要检查默认值,请查看已激活的表。

<relative_throughput>

路径组中所有路径中该路径的相对吞吐量值。 有效范围是 0-100。 如果未给出,则使用最小值 “1”。 如果给出 “0”,则在其他路径具有正值时,不会选择该路径。

每个路径的状态

<status> <fail-count> <in-flight-size> <relative_throughput>
<status>

如果路径处于活动状态,则为 ‘A’,如果路径失败,则为 ‘F’。

<fail-count>

路径失败的次数。

<in-flight-size>

路径上正在进行的 I/O 的大小。

<relative_throughput>

路径组中所有路径中该路径的相对吞吐量值。

算法

当 I/O 被分派时,dm-service-time 将 I/O 大小添加到 ‘in-flight-size’,并在完成时减去。基本上,dm-service-time 选择具有最小服务时间的路径,该服务时间通过以下公式计算:

('in-flight-size' + 'size-of-incoming-io') / 'relative_throughput'

但是,下面使用了一些优化来尽可能减少计算。

  1. 如果路径具有相同的 ‘relative_throughput’,则跳过除法,仅比较 ‘in-flight-size’。

  2. 如果路径具有相同的 ‘in-flight-size’,则跳过除法,仅比较 ‘relative_throughput’。

  3. 如果某些路径具有非零 ‘relative_throughput’,而其他路径具有零 ‘relative_throughput’,则忽略那些具有零 ‘relative_throughput’ 的路径。

如果无法应用此类优化,则计算服务时间并比较服务时间。 如果计算的服务时间相等,则具有最大 ‘relative_throughput’ 的路径可能更好。 因此,请比较 ‘relative_throughput’。

示例

如果使用 2 条路径(sda 和 sdb),repeat_count == 128,sda 的平均吞吐量为 1GB/s,sdb 的吞吐量为 4GB/s,则 sda 的 ‘relative_throughput’ 值可能为 ‘1’,而 sdb 的 ‘relative_throughput’ 值可能为 ‘4’

# echo "0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 1 8:16 128 4" \
  dmsetup create test
#
# dmsetup table
test: 0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 1 8:16 128 4
#
# dmsetup status
test: 0 10 multipath 2 0 0 0 1 1 E 0 2 2 8:0 A 0 0 1 8:16 A 0 0 4

或者 sda 的值为 ‘2’,sdb 的值为 ‘8’ 也可能是正确的

# echo "0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 2 8:16 128 8" \
  dmsetup create test
#
# dmsetup table
test: 0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 2 8:16 128 8
#
# dmsetup status
test: 0 10 multipath 2 0 0 0 1 1 E 0 2 2 8:0 A 0 0 2 8:16 A 0 0 8