rev |
line source |
igor@0
|
1 \section{Приоритезация ввода/вывода в Xen}
|
igor@0
|
2
|
igor@0
|
3 \subsection{Приоритеты для использования Disk I/O}
|
igor@0
|
4 \subsubsection{ionice}
|
igor@5
|
5 С выходом CFQ v3 в Linux 2.6.13 появилась возможность выставлять приоритеты использования дисковой подсистемы для процессов, чего раньше так не хватало. Подобно утилите \textbf{nice}, предназначенной для назначения приоритетов использования процессора, появилась утилита \textbf{ionice}, назначает для процессов приоритеты ввода/вывода.
|
igor@0
|
6
|
igor@0
|
7 Синтаксис команды прост:
|
igor@0
|
8
|
igor@0
|
9 \begin{verbatim}
|
igor@0
|
10 ionice -c класс -n приоритет -p PID
|
igor@0
|
11 \end{verbatim}
|
igor@0
|
12
|
igor@0
|
13 Класс:
|
igor@0
|
14
|
igor@0
|
15 \begin{itemize}
|
igor@5
|
16 \item 3 (Idle) — Получает приоритет на использование жесткого диска только когда другие программы ничего не пишут. Приоритеты не используются.
|
igor@5
|
17 \item 2 (Best Effort) — Класс по умолчанию. Доступные приоритеты [0-7].
|
igor@5
|
18 \item 1 (Real Time) — Даёт преимущественный доступ к диску процессу, несмотря на другие процессы. Доступные приоритеты [0-7].
|
igor@0
|
19 \end{itemize}
|
igor@0
|
20
|
igor@5
|
21 Подробнее: man ionice
|
igor@5
|
22
|
igor@5
|
23 \subsubsection{Приоритеты ввода/вывода гостевых доменов Xen}
|
igor@5
|
24 После запуска гостевых систем по \textbf{ps} \texttt{aux} можно видеть в квадратных скобках появившиеся драйвера блочных устройств xvd, после которых указан
|
igor@0
|
25 ID гостевого домена. Приоритеты для этих процессов можно устанавливать
|
igor@5
|
26 с помощью \textbf{ionice}, точно также как и для всех остальных.
|
igor@5
|
27
|
igor@5
|
28 \begin{verbatim}
|
igor@5
|
29 $ ps aux | grep xvd
|
igor@5
|
30 root 616 0.0 0.0 0 0 ? S< 16:05 0:00 [xvd 1 07:00]
|
igor@5
|
31 igor 773 0.0 0.0 3892 764 pts/0 R+ 16:08 0:00 grep xvd
|
igor@5
|
32 \end{verbatim}
|
igor@5
|
33
|
igor@5
|
34 Изменение приоритета ввода/вывода нужно выполнять для процесса 616.
|
igor@5
|
35
|
igor@5
|
36 Аналогичным образом можно выполнять и приоритезацию
|
igor@5
|
37 ввода/вывода для HVM-доменов,
|
igor@5
|
38 только для этого нужно применять
|
igor@5
|
39 \textbf{ionice} к процессам \textbf{qemu-dm},
|
igor@5
|
40 работающим в домене 0.
|
igor@5
|
41
|
igor@5
|
42 \begin{verbatim}
|
igor@5
|
43 $ ps aux | grep qemu-dm
|
igor@5
|
44 root 645 8.3 0.1 27272 2400 ? Sl 16:05 0:09 /usr/lib/xen-3.2-1/bin/qemu-dm -d 2 -domain-name winxp-hdd ...
|
igor@5
|
45 igor 769 0.0 0.0 3888 764 pts/0 R+ 16:07 0:00 grep qemu-dm
|
igor@5
|
46 \end{verbatim}
|
igor@0
|
47
|
igor@0
|
48 \subsubsection{Эксперименты}
|
igor@5
|
49 Проведём 2 эксперимента для операций чтения и записи.
|
igor@0
|
50
|
igor@0
|
51 Выставим одной гостевой системе класс \textit{Real Time}, а второй — \textit{Idle}.
|
igor@0
|
52
|
igor@0
|
53 Запустим одновременно \textit{dd} на обеих системах для записи небольшого файла. Конечно слово «одновременно» здесь весьма условно.
|
igor@0
|
54 Для повышения точности лучше провести несколько измерений.
|
igor@0
|
55
|
igor@0
|
56 \begin{verbatim}
|
igor@0
|
57 %# dd if=/dev/zero of=/root/file.txt bs=1024 count=10240000
|
igor@0
|
58 \end{verbatim}
|
igor@0
|
59
|
igor@0
|
60 В результате средняя скорость в первой гостевой системе -- 40Mb/sec, во второй -- 20Mb/sec.
|
igor@0
|
61
|
igor@0
|
62 Другим экспериментом является операция тестирования скорости чтения диска с помощью \textit{hdparm}:
|
igor@0
|
63
|
igor@0
|
64 \begin{verbatim}
|
igor@0
|
65 %# hdparm -t /dev/xvda
|
igor@0
|
66 \end{verbatim}
|
igor@0
|
67
|
igor@0
|
68 В результате в первом гостевом домене скорость — 25Mb/sec, во втором — 2Mb/sec.
|
igor@0
|
69
|
igor@0
|
70 \subsubsection{Заключение}
|
igor@0
|
71 Недостатком данного решения является отсутствие соответствующих опций в конфигурационном файле гостевых доменов Xen,
|
igor@5
|
72 что означает, что при каждом старте домена необходимо устанавливать его приоритет заново.
|
igor@0
|
73
|
igor@0
|
74 Следует обратить внимание, что данная возможность доступна только для CFQ.
|
igor@0
|
75
|
igor@0
|
76 Проверьте, какой способ приоритезации используется:
|
igor@0
|
77
|
igor@0
|
78 \begin{verbatim}
|
igor@0
|
79 cat /sys/block/ИМЯ_ДИСКА/queue/scheduler
|
igor@0
|
80 \end{verbatim}
|
igor@0
|
81
|
igor@5
|
82 Название активного планировщика должно быть в квадратных скобках.
|
igor@0
|
83 Например:
|
igor@0
|
84
|
igor@0
|
85 \begin{verbatim}
|
igor@0
|
86 $ cat /sys/block/sda/queue/scheduler
|
igor@0
|
87 noop anticipatory deadline [cfq]
|
igor@0
|
88 \end{verbatim}
|
igor@0
|
89
|
igor@5
|
90
|
igor@5
|
91 \subsection{Приоритезация ввода/вывода с помощью dm-band}
|
igor@5
|
92
|
igor@5
|
93 \textbf{dm-band} — драйвер операционной системы Linux, позволяющий управлять скоростью работы с блочными устройствами. Предназначен для использования в виртуализированной среде и с группами процессов (cgroups). В настоящее время dm-band работает как драйвер device-mapper.
|
igor@5
|
94
|
igor@5
|
95 \subsubsection{Что такое dm-band}
|
igor@5
|
96 \textbf{dm-band} — это контроллер, регулирующий полосу пропускания при выполнении операций ввода/вывода с блочным устройством,
|
igor@5
|
97 реализованный как драйвер device-mapper.
|
igor@5
|
98 Несколько работ, использующих одно физическое устройство,
|
igor@5
|
99 должны делить между собой его полосу пропускания.
|
igor@5
|
100 \textbf{dm-band} выделяет каждой работе полосу пропускания в соответствии
|
igor@5
|
101 с её весом, который может задаваться административно.
|
igor@5
|
102
|
igor@5
|
103 В настоящее время работой (job) может быть группа процессов с одинаковым
|
igor@5
|
104 идентификатором pid, pgrp или uid.
|
igor@5
|
105 В будущем планируется сделать поддержку cgroup.
|
igor@5
|
106 Работой также может быть виртуальная машина Xen или KVM.
|
igor@5
|
107
|
igor@5
|
108 \begin{verbatim}
|
igor@5
|
109 # dmsetup message band1 0 weight 40
|
igor@5
|
110 # dmsetup message band2 0 weight 10
|
igor@5
|
111 \end{verbatim}
|
igor@5
|
112
|
igor@5
|
113 \subsubsection{Как работает dm-band}
|
igor@5
|
114 У каждого band-устройства есть как минимум одна его группа,
|
igor@5
|
115 которая по умолчанию так и называется — default group.
|
igor@5
|
116
|
igor@5
|
117 Band-групп у устройства может быть и несколько.
|
igor@5
|
118 У каждой band-группы есть (1) вес и (2) закреплённая за ней работа.
|
igor@5
|
119 \textbf{dm-band} выделяет маркеры группе пропорционально её весу.
|
igor@5
|
120
|
igor@5
|
121 Если у группы есть в запасе маркеры, запрос ввода/вывода, сделанный
|
igor@5
|
122 её работой, передаётся ниже.
|
igor@5
|
123 Если же маркеров у группы не осталось, обращение блокируется.
|
igor@5
|
124 Когда группа делает запрос ввода/вывода, она тратит один маркер.
|
igor@5
|
125 Когда маркеры заканчиваются у всех групп,
|
igor@5
|
126 работающих с данным устройством, \textbf{dm-band} пополняет их запас.
|
igor@5
|
127
|
igor@5
|
128 При таком подходе работа, закреплённая за band-группой с большим весом,
|
igor@5
|
129 гарантированно получит возможность сделать большее количество
|
igor@5
|
130 запросов ввода/вывода.
|
igor@5
|
131
|
igor@5
|
132 Полоса пропускания (bandwidth) в \textbf{dm-band} определяется
|
igor@5
|
133 как отношение времени обработки маркеров данного устройства
|
igor@5
|
134 к времени обработки маркеров всех устройств.
|
igor@5
|
135 Время обработки маркера определяется длительностью цикла
|
igor@5
|
136 ввода/вывода, включающим время поиска (seek latency), задержку
|
igor@5
|
137 на обработку прерывания (interrupt latency) и прочее.
|
igor@5
|
138
|
igor@5
|
139 \subsubsection{Как его использовать}
|
igor@5
|
140 Ниже показано как управлять полосой пропускания при доступе
|
igor@5
|
141 к дискам. В примере используется один диск с двумя разделами.
|
igor@5
|
142
|
igor@5
|
143 Более подробная информация представлена в
|
igor@5
|
144 документации на ядро Linux, в файле \texttt{Document/device-mapper/band.txt}.
|
igor@5
|
145
|
igor@5
|
146 \paragraph{Создание и привязка band-устройств}
|
igor@5
|
147 Нужно создать два band-устройства \texttt{band1} и \texttt{band2} и привязать их к разделам
|
igor@5
|
148 \texttt{/dev/sda1} и \texttt{/dev/sda2} соответственно:
|
igor@5
|
149 \begin{verbatim}
|
igor@5
|
150 # dmsetup remove band1
|
igor@5
|
151 # dmsetup remove band2
|
igor@5
|
152 \end{verbatim}
|
igor@5
|
153
|
igor@5
|
154 Если команды выполнятся успешно,
|
igor@5
|
155 будут созданы новые файлы устройств \texttt{/dev/mapper/band1} и \texttt{/dev/mapper/band2}.
|
igor@5
|
156
|
igor@5
|
157 \paragraph{Управление полосой пропускания}
|
igor@5
|
158 Назначим \texttt{band1} и \texttt{band2} веса 40 и 10 соответственно:
|
igor@5
|
159
|
igor@5
|
160 \begin{verbatim}
|
igor@5
|
161 # dmsetup message band1 0 weight 40
|
igor@5
|
162 # dmsetup message band2 0 weight 10
|
igor@5
|
163 \end{verbatim}
|
igor@5
|
164
|
igor@5
|
165 После этих команд \texttt{band1} сможет использовать 80\% — 40/(40+10)\(\ast{}\)100 —
|
igor@5
|
166 полосы пропускания к физическому диску \texttt{/debv/sda},
|
igor@5
|
167 а \texttt{band2} — оставшиеся 20\%.
|
igor@5
|
168
|
igor@5
|
169 \paragraph{Дополнительные возможности}
|
igor@5
|
170 В этом примере будут созданы две дополнительные band-группы для \texttt{band1}.
|
igor@5
|
171 В первую группу входят все процессы с user-id 1000,
|
igor@5
|
172 а во вторую — процессы с user-id 2000.
|
igor@5
|
173 Их веса соответственно 30 и 20.
|
igor@5
|
174
|
igor@5
|
175 Сначала тип band-групп \texttt{band1} устанавливается равным \texttt{user}.
|
igor@5
|
176 Затем группы с user-id 1000 и 2000 присоединяются к \texttt{band1}.
|
igor@5
|
177 И последнее, назначаются веса для групп с user-id 1000 и 2000.
|
igor@5
|
178
|
igor@5
|
179 \begin{verbatim}
|
igor@5
|
180 # dmsetup message band1 0 type user
|
igor@5
|
181 # dmsetup message band1 0 attach 1000
|
igor@5
|
182 # dmsetup message band1 0 attach 2000
|
igor@5
|
183 # dmsetup message band1 0 weight 1000:30
|
igor@5
|
184 # dmsetup message band1 0 weight 2000:20
|
igor@5
|
185 \end{verbatim}
|
igor@5
|
186
|
igor@5
|
187 Теперь процессы в группе с user-id 1000
|
igor@5
|
188 могут использовать 30\% — 30/(30+20+40+10)\(\ast{}\)100 —
|
igor@5
|
189 доступной физической полосы пропускания диска.
|
igor@5
|
190
|
igor@5
|
191 \begin{verbatim}
|
igor@5
|
192 Band Device Band Group Weight
|
igor@5
|
193 band1 user id 1000 30
|
igor@5
|
194 band1 user id 2000 20
|
igor@5
|
195 band1 default group(the other users) 40
|
igor@5
|
196 band2 default group 10
|
igor@5
|
197 \end{verbatim}
|
igor@5
|
198
|
igor@5
|
199 \paragraph{Удаление band-устройств}
|
igor@5
|
200 Удалить band-устройства, которые больше не используются,
|
igor@5
|
201 можно так:
|
igor@5
|
202
|
igor@5
|
203 \begin{verbatim}
|
igor@5
|
204 # dmsetup remove band1
|
igor@5
|
205 # dmsetup remove band2
|
igor@5
|
206 \end{verbatim}
|
igor@5
|
207
|
igor@5
|
208 \subsubsection{Планы на будущее}
|
igor@5
|
209 Что можно было бы сделать в будущих версиях:
|
igor@5
|
210 \begin{itemize}
|
igor@5
|
211 \item Добавить поддержку Cgroup;
|
igor@5
|
212 \item Управлять скоростью записи и чтения по отдельности;
|
igor@5
|
213 \item Добавить поддержку WRITE\_BARRIER;
|
igor@5
|
214 \item Оптимизировать;
|
igor@5
|
215 \item Добавить дополнительные инструменты для настройки (или хватит одного \textbf{dmsetup}?);
|
igor@5
|
216 \item Создать новые политики планировщика BIOs (или достаточно уже существующей, весовой?).
|
igor@5
|
217 \end{itemize}
|
igor@5
|
218
|
igor@5
|
219 \subsubsection{Замеры}
|
igor@5
|
220 Ниже представлены результаты замеров, которые выполнил разработчик \textbf{dm-band}, Ryo Tsuruta.
|
igor@5
|
221 Они подтверждают то, что \textbf{dm-band} работает так, как и ожидалось.
|
igor@5
|
222 В ходе экспериментов создаётся несколько band-групп на нескольких физических разделах
|
igor@5
|
223 и выполняется интенсивный ввод/вывод на эти устройства.
|
igor@5
|
224
|
igor@5
|
225 \paragraph{Железо для испытаний}
|
igor@5
|
226
|
igor@5
|
227 \begin{verbatim}
|
igor@5
|
228 DELL Dimention E521:
|
igor@5
|
229
|
igor@5
|
230 Linux kappa.local.valinux.co.jp 2.6.23.14 #1 SMP
|
igor@5
|
231 Thu Jan 24 17:24:59 JST 2008 i686 athlon i386 GNU/Linux
|
igor@5
|
232 Detected 2004.217 MHz processor.
|
igor@5
|
233 CPU0: AMD Athlon(tm) 64 X2 Dual Core Processor 3800+ stepping 02
|
igor@5
|
234 Memory: 966240k/981888k available (2102k kernel code, 14932k reserved,
|
igor@5
|
235 890k data, 216k init, 64384k highmem)
|
igor@5
|
236 scsi 2:0:0:0: Direct-Access ATA ST3250620AS 3.AA PQ: 0 ANSI: 5
|
igor@5
|
237 sd 2:0:0:0: [sdb] 488397168 512-byte hardware sectors (250059 MB)
|
igor@5
|
238 sd 2:0:0:0: [sdb] Write Protect is off
|
igor@5
|
239 sd 2:0:0:0: [sdb] Mode Sense: 00 3a 00 00
|
igor@5
|
240 sd 2:0:0:0: [sdb] Write cache: enabled, read cache: enabled,
|
igor@5
|
241 doesn't support DPO or FUA
|
igor@5
|
242 sdb: sdb1 sdb2 < sdb5 sdb6 sdb7 sdb8 sdb9 sdb10 sdb11 sdb12 sdb13 sdb14
|
igor@5
|
243 sdb15 >
|
igor@5
|
244 \end{verbatim}
|
igor@5
|
245
|
igor@5
|
246 \paragraph{Результаты тестирования управления полосой пропускания для разделов}
|
igor@5
|
247 Конфигурация для эксперимента \#1:
|
igor@5
|
248 \begin{itemize}
|
igor@5
|
249 \item Создать три раздела \texttt{sdb5}, \texttt{sdb6} и \texttt{sdb7}.
|
igor@5
|
250 \item Назначить веса 40, 20 и 10 соответственно для \texttt{sdb5}, \texttt{sdb6} и \texttt{sdb7}.
|
igor@5
|
251 \item Запустить 128 процессов, выполняющих одновременно случайные операции прямого чтения и прямой записи блоков размером 4KB
|
igor@5
|
252 \item Подсчитать количество выполненных операций в течение 60 секунд.
|
igor@5
|
253 \end{itemize}
|
igor@5
|
254
|
igor@5
|
255 \begin{verbatim}
|
igor@5
|
256 результат эксперимента #1
|
igor@5
|
257 ---------------------------------------------------------------------------
|
igor@5
|
258 | device | sdb5 | sdb6 | sdb7 |
|
igor@5
|
259 | weight | 40 (57.0%) | 20 (29.0%) | 10 (14.0%) |
|
igor@5
|
260 |-----------------+-------------------+-------------------+-----------------|
|
igor@5
|
261 | I/Os (r/w) | 6640( 3272/ 3368)| 3434( 1719/ 1715)| 1689( 857/ 832)|
|
igor@5
|
262 | sectors (r/w) | 53120(26176/26944)| 27472(13752/13720)| 13512(6856/6656)|
|
igor@5
|
263 | ratio to total | 56.4% | 29.2% | 14.4% |
|
igor@5
|
264 ---------------------------------------------------------------------------
|
igor@5
|
265 \end{verbatim}
|
igor@5
|
266
|
igor@5
|
267 Конфигурация для эксперимента \#2:
|
igor@5
|
268 \begin{itemize}
|
igor@5
|
269 \item в точности такая же как для эксперимента \#1, за исключением того, что не запускаются процессы, работающие с \texttt{sdb6}
|
igor@5
|
270 \end{itemize}
|
igor@5
|
271
|
igor@5
|
272 \begin{verbatim}
|
igor@5
|
273 результаты эксперимента #2
|
igor@5
|
274 ---------------------------------------------------------------------------
|
igor@5
|
275 | device | sdb5 | sdb6 | sdb7 |
|
igor@5
|
276 | weight | 40 (57.0%) | 20 (29.0%) | 10 (14.0%) |
|
igor@5
|
277 |-----------------+-------------------+-------------------+-----------------|
|
igor@5
|
278 | I/Os (r/w) | 9566(4815/ 4751)| 0( 0/ 0)| 2370(1198/1172)|
|
igor@5
|
279 | sectors (r/w) | 76528(38520/38008)| 0( 0/ 0)| 18960(9584/9376)|
|
igor@5
|
280 | ratio to total | 76.8% | 0.0% | 23.2% |
|
igor@5
|
281 ---------------------------------------------------------------------------
|
igor@5
|
282 \end{verbatim}
|
igor@5
|
283
|
igor@5
|
284 \paragraph{Результаты тестирования управления полосой пропускания для band-групп}
|
igor@5
|
285 Конфигурация для эксперимента \#3:
|
igor@5
|
286 \begin{itemize}
|
igor@5
|
287 \item Создать два раздела \texttt{sdb5} и \texttt{sdb6}
|
igor@5
|
288 \item Создать две дополнительные band-группы на \texttt{sdb5}, первая для \texttt{user1} и вторая для \texttt{user2}.
|
igor@5
|
289 \item Назначить веса 40, 20, 10 и 10 для band-групп \texttt{user1}, \texttt{user2}, default-групп разделов \texttt{sdb5} и \texttt{sdb6} соответственно
|
igor@5
|
290 \item Запустить 128 процессов, выполняющих одновременно случайные операции прямого чтения и прямой записи блоков размером 4KB
|
igor@5
|
291 \item Подсчитать количество выполненных операций в течение 60 секунд.
|
igor@5
|
292 \end{itemize}
|
igor@5
|
293
|
igor@5
|
294 \begin{verbatim}
|
igor@5
|
295 результаты эксперимента #3
|
igor@5
|
296 ---------------------------------------------------------------------------
|
igor@5
|
297 |dev| sdb5 | sdb6 |
|
igor@5
|
298 |---+------------------------------------------------------+----------------|
|
igor@5
|
299 |usr| user1 | user2 | other users | all users |
|
igor@5
|
300 |wgt| 40 (50.0%) | 20 (25.0%) | 10 (12.5%) | 10 (12.5%) |
|
igor@5
|
301 |---+------------------+------------------+----------------+----------------|
|
igor@5
|
302 |I/O| 5951( 2940/ 3011)| 3068( 1574/ 1494)| 1663( 828/ 835)| 1663( 810/ 853)|
|
igor@5
|
303 |sec|47608(23520/24088)|24544(12592/11952)|13304(6624/6680)|13304(6480/6824)|
|
igor@5
|
304 | % | 48.2% | 24.9% | 13.5% | 13.5% |
|
igor@5
|
305 ---------------------------------------------------------------------------
|
igor@5
|
306 \end{verbatim}
|
igor@5
|
307
|
igor@5
|
308 Конфигурация для эксперимента \#4:
|
igor@5
|
309 \begin{itemize}
|
igor@5
|
310 \item в точности такая же как для эксперимента \#3, за исключением того, что не запускаются процессы, работающие с band-группой \texttt{user2}
|
igor@5
|
311 \end{itemize}
|
igor@5
|
312
|
igor@5
|
313 \begin{verbatim}
|
igor@5
|
314 результаты эксперимента #4
|
igor@5
|
315 ---------------------------------------------------------------------------
|
igor@5
|
316 |dev| sdb5 | sdb6 |
|
igor@5
|
317 |---+------------------------------------------------------+----------------|
|
igor@5
|
318 |usr| user1 | user2 | other users | all users |
|
igor@5
|
319 |wgt| 40 (50.0%) | 20 (25.0%) | 10 (12.5%) | 10 (12.5%) |
|
igor@5
|
320 |---+------------------+------------------+----------------+----------------|
|
igor@5
|
321 |I/O| 8002( 3963/ 4039)| 0( 0/ 0)| 2056(1021/1035)| 2008( 998/1010)|
|
igor@5
|
322 |sec|64016(31704/32312)| 0( 0/ 0)|16448(8168/8280)|16064(7984/8080)|
|
igor@5
|
323 | % | 66.3% | 0.0% | 17.0% | 16.6% |
|
igor@5
|
324 ---------------------------------------------------------------------------
|
igor@5
|
325 \end{verbatim}
|
igor@5
|
326
|
igor@5
|
327 \paragraph{Выводы}
|
igor@5
|
328 \textbf{dm-band} работает хорошо при выполнении случайных операций чтение/запись.
|
igor@5
|
329 В будущем планируется провести тестирование на
|
igor@5
|
330 реальных приложениях, таких как СУБД и файловые серверы.
|
igor@5
|
331
|
igor@5
|
332 \subsubsection{Почему нельзя было просто доработать CFQ?}
|
igor@5
|
333 В Linux есть механизмы для приоритезации дискового ввода/вывода.
|
igor@5
|
334 Почему нельзя было использовать их?
|
igor@5
|
335
|
igor@5
|
336 Ниже перевод письма одного из соавторов dm-band Хироказу Такаши (Hirokazu Takashi)
|
igor@5
|
337 в список рассылки Xen-devel\url{http://lists.xensource.com/archives/html/xen-devel/2008-01/msg00852.html},
|
igor@5
|
338 в котором он отвечает на этот вопрос.
|
igor@5
|
339
|
igor@5
|
340 \begin{verbatim}
|
igor@5
|
341 From: Hirokazu Takahashi <taka@valinux.co.jp>
|
igor@5
|
342
|
igor@5
|
343 Доработать стандартный планировщик ввода/вывода, который есть в ядре,
|
igor@5
|
344 это самый простой подход. Действительно, планировщик CFQ
|
igor@5
|
345 можно было бы научить управлять полосой пропускания путём
|
igor@5
|
346 относительного небольшой модификации кода.
|
igor@5
|
347 Оба подхода (использовать device-mapper и модифицировать CFQ)
|
igor@5
|
348 имеют свои плюсы и минусы.
|
igor@5
|
349
|
igor@5
|
350 В настоящее время мы выбрали вариант с device-mapper по следующим причинам:
|
igor@5
|
351 * он может работать с любым планировщиком. Некоторые хотят использовать планировщик NOOP
|
igor@5
|
352 для работы с high-end хранилищами;
|
igor@5
|
353 * его должны использовать только те, кому нужно управление пропускной способностью I/O;
|
igor@5
|
354 * он независим от других планировщиков и его легко поддерживать;
|
igor@5
|
355 * не усложняется сопровождение CFQ.
|
igor@5
|
356
|
igor@5
|
357 У сегодняшней реализации планировщика CFQ есть некоторые ограничения,
|
igor@5
|
358 которые мешают использовать его для управления полосой пропускания так,
|
igor@5
|
359 как хотелось бы. У планировщика есть только 7 уровней приоритета,
|
igor@5
|
360 что означает, что у него есть только 7 классов ввода/вывода.
|
igor@5
|
361 Если назначить один и тот же приоритет A нескольким виртуальным машинам,
|
igor@5
|
362 эти машины должны будут поровну делить полосу ввода/вывода,
|
igor@5
|
363 выделенную классу A. Если при этом есть машина, работающая с приоритетом B,
|
igor@5
|
364 более низким чем A, и она такая одна, может так получится, что у неё будет
|
igor@5
|
365 большая полоса пропускания чем у машин класса A.
|
igor@5
|
366
|
igor@5
|
367 Вообще, я думаю, что нужно чтобы в CFQ был планировщик с двумя уровнями.
|
igor@5
|
368 Один уровень используется для выбора лучшей группы cgroup или работы (job),
|
igor@5
|
369 а второй — для выбора класса с наивысшим приоритетом ввода/вывода.
|
igor@5
|
370
|
igor@5
|
371 Второй минус подхода с использованием существующего планировщика в том,
|
igor@5
|
372 что у него приоритеты ввода/вывода глобальны,
|
igor@5
|
373 и они распространяются на все диски, к которым осуществляется доступ.
|
igor@5
|
374 Нельзя сделать так, чтобы у задачи были разные приоритеты при доступе к разным дискам.
|
igor@5
|
375
|
igor@5
|
376 У подхода с использованием device-mapper тоже есть свои минусы.
|
igor@5
|
377 Сложно получить информацию о возможностях и конфигурации нижележащих устройств,
|
igor@5
|
378 такую, например, как информацию о разделах и LUN. И возможно, потребуется разрабатывать
|
igor@5
|
379 дополнительные инструменты для настойки.
|
igor@5
|
380 \end{verbatim}
|
igor@5
|
381
|
igor@0
|
382 \subsection{Дополнительная информация}
|
igor@0
|
383 \begin{itemize}
|
igor@5
|
384 \item \htmladdnormallinkfoot{Приоритезация ввода/вывода в Xen с помощью планировщика CFQ}{http://xgu.ru/wiki/xen/io} (рус.)
|
igor@5
|
385 \item \htmladdnormallinkfoot{Приоритезация ввода/вывода с помощью dm-band}{http://xgu.ru/wiki/dm-band} (рус.)
|
igor@0
|
386 \end{itemize}
|