xg-scale

view xen/io.tex @ 6:4a790b55d005

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