diff options
author | Kiyoshi Ueda <k-ueda@ct.jp.nec.com> | 2009-06-22 05:12:28 -0400 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2009-06-22 05:12:28 -0400 |
commit | f392ba889b019602976082bfe7bf486c2594f85c (patch) | |
tree | 962e8f354dfe3df2021476412be8d1bcec8a03d0 /Documentation/device-mapper | |
parent | fd5e033908b7b743b5650790f196761dd930f988 (diff) |
dm mpath: add service time load balancer
This patch adds a service time oriented dynamic load balancer,
dm-service-time, which selects the path with the shortest estimated
service time for the incoming I/O.
The service time is estimated by dividing the in-flight I/O size
by a performance value of each path.
The performance value can be given as a table argument at the table
loading time. If no performance value is given, all paths are
considered equal.
Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'Documentation/device-mapper')
-rw-r--r-- | Documentation/device-mapper/dm-service-time.txt | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Documentation/device-mapper/dm-service-time.txt b/Documentation/device-mapper/dm-service-time.txt new file mode 100644 index 000000000000..7d00668e97bb --- /dev/null +++ b/Documentation/device-mapper/dm-service-time.txt | |||
@@ -0,0 +1,91 @@ | |||
1 | dm-service-time | ||
2 | =============== | ||
3 | |||
4 | dm-service-time is a path selector module for device-mapper targets, | ||
5 | which selects a path with the shortest estimated service time for | ||
6 | the incoming I/O. | ||
7 | |||
8 | The service time for each path is estimated by dividing the total size | ||
9 | of in-flight I/Os on a path with the performance value of the path. | ||
10 | The performance value is a relative throughput value among all paths | ||
11 | in a path-group, and it can be specified as a table argument. | ||
12 | |||
13 | The path selector name is 'service-time'. | ||
14 | |||
15 | Table parameters for each path: [<repeat_count> [<relative_throughput>]] | ||
16 | <repeat_count>: The number of I/Os to dispatch using the selected | ||
17 | path before switching to the next path. | ||
18 | If not given, internal default is used. To check | ||
19 | the default value, see the activated table. | ||
20 | <relative_throughput>: The relative throughput value of the path | ||
21 | among all paths in the path-group. | ||
22 | The valid range is 0-100. | ||
23 | If not given, minimum value '1' is used. | ||
24 | If '0' is given, the path isn't selected while | ||
25 | other paths having a positive value are available. | ||
26 | |||
27 | Status for each path: <status> <fail-count> <in-flight-size> \ | ||
28 | <relative_throughput> | ||
29 | <status>: 'A' if the path is active, 'F' if the path is failed. | ||
30 | <fail-count>: The number of path failures. | ||
31 | <in-flight-size>: The size of in-flight I/Os on the path. | ||
32 | <relative_throughput>: The relative throughput value of the path | ||
33 | among all paths in the path-group. | ||
34 | |||
35 | |||
36 | Algorithm | ||
37 | ========= | ||
38 | |||
39 | dm-service-time adds the I/O size to 'in-flight-size' when the I/O is | ||
40 | dispatched and substracts when completed. | ||
41 | Basically, dm-service-time selects a path having minimum service time | ||
42 | which is calculated by: | ||
43 | |||
44 | ('in-flight-size' + 'size-of-incoming-io') / 'relative_throughput' | ||
45 | |||
46 | However, some optimizations below are used to reduce the calculation | ||
47 | as much as possible. | ||
48 | |||
49 | 1. If the paths have the same 'relative_throughput', skip | ||
50 | the division and just compare the 'in-flight-size'. | ||
51 | |||
52 | 2. If the paths have the same 'in-flight-size', skip the division | ||
53 | and just compare the 'relative_throughput'. | ||
54 | |||
55 | 3. If some paths have non-zero 'relative_throughput' and others | ||
56 | have zero 'relative_throughput', ignore those paths with zero | ||
57 | 'relative_throughput'. | ||
58 | |||
59 | If such optimizations can't be applied, calculate service time, and | ||
60 | compare service time. | ||
61 | If calculated service time is equal, the path having maximum | ||
62 | 'relative_throughput' may be better. So compare 'relative_throughput' | ||
63 | then. | ||
64 | |||
65 | |||
66 | Examples | ||
67 | ======== | ||
68 | In case that 2 paths (sda and sdb) are used with repeat_count == 128 | ||
69 | and sda has an average throughput 1GB/s and sdb has 4GB/s, | ||
70 | 'relative_throughput' value may be '1' for sda and '4' for sdb. | ||
71 | |||
72 | # echo "0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 1 8:16 128 4" \ | ||
73 | dmsetup create test | ||
74 | # | ||
75 | # dmsetup table | ||
76 | test: 0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 1 8:16 128 4 | ||
77 | # | ||
78 | # dmsetup status | ||
79 | 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 | ||
80 | |||
81 | |||
82 | Or '2' for sda and '8' for sdb would be also true. | ||
83 | |||
84 | # echo "0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 2 8:16 128 8" \ | ||
85 | dmsetup create test | ||
86 | # | ||
87 | # dmsetup table | ||
88 | test: 0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 2 8:16 128 8 | ||
89 | # | ||
90 | # dmsetup status | ||
91 | 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 | ||