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>

路徑在路徑組中所有路徑中的相對吞吐量值。

演算法

dm-service-time 在 I/O 分派時將 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”。

示例

在兩根路徑(sda 和 sdb)且 repeat_count == 128 的情況下,如果 sda 的平均吞吐量為 1GB/s,sdb 為 4GB/s,則 sda 的“relative_throughput”值可能為“1”,sdb 為“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