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'
然而,為儘可能減少計算量,使用了一些如下最佳化。
如果路徑具有相同的“relative_throughput”,則跳過除法,僅比較“in-flight-size”。
如果路徑具有相同的“in-flight-size”,則跳過除法,僅比較“relative_throughput”。
如果某些路徑具有非零的“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