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'
但是,下面使用了一些优化来尽可能减少计算。
如果路径具有相同的 ‘relative_throughput’,则跳过除法,仅比较 ‘in-flight-size’。
如果路径具有相同的 ‘in-flight-size’,则跳过除法,仅比较 ‘relative_throughput’。
如果某些路径具有非零 ‘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