xg-scale
changeset 5:75853b740e5a
Добавлен подраздел про dm-band и исправлены небольшие опечатки касающиеся использования CFQ
author | Igor Chubin <igor@chub.in> |
---|---|
date | Sun Jul 06 23:46:33 2008 +0300 (2008-07-06) |
parents | 253d66dd74bb |
children | 4a790b55d005 |
files | xen/io.tex |
line diff
1.1 --- a/xen/io.tex Sun Jul 06 23:27:46 2008 +0300 1.2 +++ b/xen/io.tex Sun Jul 06 23:46:33 2008 +0300 1.3 @@ -2,7 +2,7 @@ 1.4 1.5 \subsection{Приоритеты для использования Disk I/O} 1.6 \subsubsection{ionice} 1.7 -С выходом CFQ v3 в Linux 2.6.13 появилась возможность выставлять приоритеты использования дисковой подсистемы для процессов, чего раньше так не хватало. Подобно утилите nice для назначение приоритетов использования процессора появилась утилита ionice. 1.8 +С выходом CFQ v3 в Linux 2.6.13 появилась возможность выставлять приоритеты использования дисковой подсистемы для процессов, чего раньше так не хватало. Подобно утилите \textbf{nice}, предназначенной для назначения приоритетов использования процессора, появилась утилита \textbf{ionice}, назначает для процессов приоритеты ввода/вывода. 1.9 1.10 Синтаксис команды прост: 1.11 1.12 @@ -13,19 +13,40 @@ 1.13 Класс: 1.14 1.15 \begin{itemize} 1.16 -\item 3, Idle — Получает приоритет на использование жесткого диска только когда другие программы ничего не пишут. Приоритеты не используются. 1.17 -\item 2, Best Effort — Класс по умолчанию. Доступные приоритеты [0-7]. 1.18 -\item 1, Real Time — Даёт преимущественный доступ к диску процессу, несмотря на другие процессы. Доступные приоритеты [0-7]. 1.19 +\item 3 (Idle) — Получает приоритет на использование жесткого диска только когда другие программы ничего не пишут. Приоритеты не используются. 1.20 +\item 2 (Best Effort) — Класс по умолчанию. Доступные приоритеты [0-7]. 1.21 +\item 1 (Real Time) — Даёт преимущественный доступ к диску процессу, несмотря на другие процессы. Доступные приоритеты [0-7]. 1.22 \end{itemize} 1.23 1.24 -\subsubsection{Приоритеты гостевых доменов} 1.25 -Теперь вернемся к самому Xen. 1.26 -После запуска гостевых систем по \textit{ps aux} можно видеть в квадратных скобках появившиеся драйвера блочных устройств xvd, после которых указан 1.27 +Подробнее: man ionice 1.28 + 1.29 +\subsubsection{Приоритеты ввода/вывода гостевых доменов Xen} 1.30 +После запуска гостевых систем по \textbf{ps} \texttt{aux} можно видеть в квадратных скобках появившиеся драйвера блочных устройств xvd, после которых указан 1.31 ID гостевого домена. Приоритеты для этих процессов можно устанавливать 1.32 -с помощью \textit{ionice}, точно также как и для всех остальных. 1.33 +с помощью \textbf{ionice}, точно также как и для всех остальных. 1.34 + 1.35 +\begin{verbatim} 1.36 +$ ps aux | grep xvd 1.37 +root 616 0.0 0.0 0 0 ? S< 16:05 0:00 [xvd 1 07:00] 1.38 +igor 773 0.0 0.0 3892 764 pts/0 R+ 16:08 0:00 grep xvd 1.39 +\end{verbatim} 1.40 + 1.41 +Изменение приоритета ввода/вывода нужно выполнять для процесса 616. 1.42 + 1.43 +Аналогичным образом можно выполнять и приоритезацию 1.44 +ввода/вывода для HVM-доменов, 1.45 +только для этого нужно применять 1.46 +\textbf{ionice} к процессам \textbf{qemu-dm}, 1.47 +работающим в домене 0. 1.48 + 1.49 +\begin{verbatim} 1.50 +$ ps aux | grep qemu-dm 1.51 +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 ... 1.52 +igor 769 0.0 0.0 3888 764 pts/0 R+ 16:07 0:00 grep qemu-dm 1.53 +\end{verbatim} 1.54 1.55 \subsubsection{Эксперименты} 1.56 -Проведем 2 эксперимента для операций чтения и записи. 1.57 +Проведём 2 эксперимента для операций чтения и записи. 1.58 1.59 Выставим одной гостевой системе класс \textit{Real Time}, а второй — \textit{Idle}. 1.60 1.61 @@ -48,7 +69,7 @@ 1.62 1.63 \subsubsection{Заключение} 1.64 Недостатком данного решения является отсутствие соответствующих опций в конфигурационном файле гостевых доменов Xen, 1.65 -что означает, что при каждом старте домена необходимо устанавливаеть его приоритет заново. 1.66 +что означает, что при каждом старте домена необходимо устанавливать его приоритет заново. 1.67 1.68 Следует обратить внимание, что данная возможность доступна только для CFQ. 1.69 1.70 @@ -58,7 +79,7 @@ 1.71 cat /sys/block/ИМЯ_ДИСКА/queue/scheduler 1.72 \end{verbatim} 1.73 1.74 -Активный sheduler должен быть в квадратных скобках. 1.75 +Название активного планировщика должно быть в квадратных скобках. 1.76 Например: 1.77 1.78 \begin{verbatim} 1.79 @@ -66,11 +87,300 @@ 1.80 noop anticipatory deadline [cfq] 1.81 \end{verbatim} 1.82 1.83 + 1.84 +\subsection{Приоритезация ввода/вывода с помощью dm-band} 1.85 + 1.86 +\textbf{dm-band} — драйвер операционной системы Linux, позволяющий управлять скоростью работы с блочными устройствами. Предназначен для использования в виртуализированной среде и с группами процессов (cgroups). В настоящее время dm-band работает как драйвер device-mapper. 1.87 + 1.88 +\subsubsection{Что такое dm-band} 1.89 +\textbf{dm-band} — это контроллер, регулирующий полосу пропускания при выполнении операций ввода/вывода с блочным устройством, 1.90 +реализованный как драйвер device-mapper. 1.91 +Несколько работ, использующих одно физическое устройство, 1.92 +должны делить между собой его полосу пропускания. 1.93 +\textbf{dm-band} выделяет каждой работе полосу пропускания в соответствии 1.94 +с её весом, который может задаваться административно. 1.95 + 1.96 +В настоящее время работой (job) может быть группа процессов с одинаковым 1.97 +идентификатором pid, pgrp или uid. 1.98 +В будущем планируется сделать поддержку cgroup. 1.99 +Работой также может быть виртуальная машина Xen или KVM. 1.100 + 1.101 +\begin{verbatim} 1.102 +# dmsetup message band1 0 weight 40 1.103 +# dmsetup message band2 0 weight 10 1.104 +\end{verbatim} 1.105 + 1.106 +\subsubsection{Как работает dm-band} 1.107 +У каждого band-устройства есть как минимум одна его группа, 1.108 +которая по умолчанию так и называется — default group. 1.109 + 1.110 +Band-групп у устройства может быть и несколько. 1.111 +У каждой band-группы есть (1) вес и (2) закреплённая за ней работа. 1.112 +\textbf{dm-band} выделяет маркеры группе пропорционально её весу. 1.113 + 1.114 +Если у группы есть в запасе маркеры, запрос ввода/вывода, сделанный 1.115 +её работой, передаётся ниже. 1.116 +Если же маркеров у группы не осталось, обращение блокируется. 1.117 +Когда группа делает запрос ввода/вывода, она тратит один маркер. 1.118 +Когда маркеры заканчиваются у всех групп, 1.119 +работающих с данным устройством, \textbf{dm-band} пополняет их запас. 1.120 + 1.121 +При таком подходе работа, закреплённая за band-группой с большим весом, 1.122 +гарантированно получит возможность сделать большее количество 1.123 +запросов ввода/вывода. 1.124 + 1.125 +Полоса пропускания (bandwidth) в \textbf{dm-band} определяется 1.126 +как отношение времени обработки маркеров данного устройства 1.127 +к времени обработки маркеров всех устройств. 1.128 +Время обработки маркера определяется длительностью цикла 1.129 +ввода/вывода, включающим время поиска (seek latency), задержку 1.130 +на обработку прерывания (interrupt latency) и прочее. 1.131 + 1.132 +\subsubsection{Как его использовать} 1.133 +Ниже показано как управлять полосой пропускания при доступе 1.134 +к дискам. В примере используется один диск с двумя разделами. 1.135 + 1.136 +Более подробная информация представлена в 1.137 +документации на ядро Linux, в файле \texttt{Document/device-mapper/band.txt}. 1.138 + 1.139 +\paragraph{Создание и привязка band-устройств} 1.140 +Нужно создать два band-устройства \texttt{band1} и \texttt{band2} и привязать их к разделам 1.141 +\texttt{/dev/sda1} и \texttt{/dev/sda2} соответственно: 1.142 +\begin{verbatim} 1.143 + # dmsetup remove band1 1.144 + # dmsetup remove band2 1.145 +\end{verbatim} 1.146 + 1.147 +Если команды выполнятся успешно, 1.148 +будут созданы новые файлы устройств \texttt{/dev/mapper/band1} и \texttt{/dev/mapper/band2}. 1.149 + 1.150 +\paragraph{Управление полосой пропускания} 1.151 +Назначим \texttt{band1} и \texttt{band2} веса 40 и 10 соответственно: 1.152 + 1.153 +\begin{verbatim} 1.154 +# dmsetup message band1 0 weight 40 1.155 +# dmsetup message band2 0 weight 10 1.156 +\end{verbatim} 1.157 + 1.158 +После этих команд \texttt{band1} сможет использовать 80\% — 40/(40+10)\(\ast{}\)100 — 1.159 +полосы пропускания к физическому диску \texttt{/debv/sda}, 1.160 +а \texttt{band2} — оставшиеся 20\%. 1.161 + 1.162 +\paragraph{Дополнительные возможности} 1.163 +В этом примере будут созданы две дополнительные band-группы для \texttt{band1}. 1.164 +В первую группу входят все процессы с user-id 1000, 1.165 +а во вторую — процессы с user-id 2000. 1.166 +Их веса соответственно 30 и 20. 1.167 + 1.168 +Сначала тип band-групп \texttt{band1} устанавливается равным \texttt{user}. 1.169 +Затем группы с user-id 1000 и 2000 присоединяются к \texttt{band1}. 1.170 +И последнее, назначаются веса для групп с user-id 1000 и 2000. 1.171 + 1.172 +\begin{verbatim} 1.173 +# dmsetup message band1 0 type user 1.174 + # dmsetup message band1 0 attach 1000 1.175 + # dmsetup message band1 0 attach 2000 1.176 + # dmsetup message band1 0 weight 1000:30 1.177 + # dmsetup message band1 0 weight 2000:20 1.178 +\end{verbatim} 1.179 + 1.180 +Теперь процессы в группе с user-id 1000 1.181 +могут использовать 30\% — 30/(30+20+40+10)\(\ast{}\)100 — 1.182 +доступной физической полосы пропускания диска. 1.183 + 1.184 +\begin{verbatim} 1.185 +Band Device Band Group Weight 1.186 + band1 user id 1000 30 1.187 + band1 user id 2000 20 1.188 + band1 default group(the other users) 40 1.189 + band2 default group 10 1.190 +\end{verbatim} 1.191 + 1.192 +\paragraph{Удаление band-устройств} 1.193 +Удалить band-устройства, которые больше не используются, 1.194 +можно так: 1.195 + 1.196 +\begin{verbatim} 1.197 + # dmsetup remove band1 1.198 + # dmsetup remove band2 1.199 +\end{verbatim} 1.200 + 1.201 +\subsubsection{Планы на будущее} 1.202 +Что можно было бы сделать в будущих версиях: 1.203 +\begin{itemize} 1.204 +\item Добавить поддержку Cgroup; 1.205 +\item Управлять скоростью записи и чтения по отдельности; 1.206 +\item Добавить поддержку WRITE\_BARRIER; 1.207 +\item Оптимизировать; 1.208 +\item Добавить дополнительные инструменты для настройки (или хватит одного \textbf{dmsetup}?); 1.209 +\item Создать новые политики планировщика BIOs (или достаточно уже существующей, весовой?). 1.210 +\end{itemize} 1.211 + 1.212 +\subsubsection{Замеры} 1.213 +Ниже представлены результаты замеров, которые выполнил разработчик \textbf{dm-band}, Ryo Tsuruta. 1.214 +Они подтверждают то, что \textbf{dm-band} работает так, как и ожидалось. 1.215 +В ходе экспериментов создаётся несколько band-групп на нескольких физических разделах 1.216 +и выполняется интенсивный ввод/вывод на эти устройства. 1.217 + 1.218 +\paragraph{Железо для испытаний} 1.219 + 1.220 +\begin{verbatim} 1.221 +DELL Dimention E521: 1.222 + 1.223 + Linux kappa.local.valinux.co.jp 2.6.23.14 #1 SMP 1.224 + Thu Jan 24 17:24:59 JST 2008 i686 athlon i386 GNU/Linux 1.225 + Detected 2004.217 MHz processor. 1.226 + CPU0: AMD Athlon(tm) 64 X2 Dual Core Processor 3800+ stepping 02 1.227 + Memory: 966240k/981888k available (2102k kernel code, 14932k reserved, 1.228 + 890k data, 216k init, 64384k highmem) 1.229 + scsi 2:0:0:0: Direct-Access ATA ST3250620AS 3.AA PQ: 0 ANSI: 5 1.230 + sd 2:0:0:0: [sdb] 488397168 512-byte hardware sectors (250059 MB) 1.231 + sd 2:0:0:0: [sdb] Write Protect is off 1.232 + sd 2:0:0:0: [sdb] Mode Sense: 00 3a 00 00 1.233 + sd 2:0:0:0: [sdb] Write cache: enabled, read cache: enabled, 1.234 + doesn't support DPO or FUA 1.235 + sdb: sdb1 sdb2 < sdb5 sdb6 sdb7 sdb8 sdb9 sdb10 sdb11 sdb12 sdb13 sdb14 1.236 + sdb15 > 1.237 +\end{verbatim} 1.238 + 1.239 +\paragraph{Результаты тестирования управления полосой пропускания для разделов} 1.240 +Конфигурация для эксперимента \#1: 1.241 +\begin{itemize} 1.242 +\item Создать три раздела \texttt{sdb5}, \texttt{sdb6} и \texttt{sdb7}. 1.243 +\item Назначить веса 40, 20 и 10 соответственно для \texttt{sdb5}, \texttt{sdb6} и \texttt{sdb7}. 1.244 +\item Запустить 128 процессов, выполняющих одновременно случайные операции прямого чтения и прямой записи блоков размером 4KB 1.245 +\item Подсчитать количество выполненных операций в течение 60 секунд. 1.246 +\end{itemize} 1.247 + 1.248 +\begin{verbatim} 1.249 +результат эксперимента #1 1.250 + --------------------------------------------------------------------------- 1.251 +| device | sdb5 | sdb6 | sdb7 | 1.252 +| weight | 40 (57.0%) | 20 (29.0%) | 10 (14.0%) | 1.253 +|-----------------+-------------------+-------------------+-----------------| 1.254 +| I/Os (r/w) | 6640( 3272/ 3368)| 3434( 1719/ 1715)| 1689( 857/ 832)| 1.255 +| sectors (r/w) | 53120(26176/26944)| 27472(13752/13720)| 13512(6856/6656)| 1.256 +| ratio to total | 56.4% | 29.2% | 14.4% | 1.257 + --------------------------------------------------------------------------- 1.258 +\end{verbatim} 1.259 + 1.260 +Конфигурация для эксперимента \#2: 1.261 +\begin{itemize} 1.262 +\item в точности такая же как для эксперимента \#1, за исключением того, что не запускаются процессы, работающие с \texttt{sdb6} 1.263 +\end{itemize} 1.264 + 1.265 +\begin{verbatim} 1.266 +результаты эксперимента #2 1.267 + --------------------------------------------------------------------------- 1.268 +| device | sdb5 | sdb6 | sdb7 | 1.269 +| weight | 40 (57.0%) | 20 (29.0%) | 10 (14.0%) | 1.270 +|-----------------+-------------------+-------------------+-----------------| 1.271 +| I/Os (r/w) | 9566(4815/ 4751)| 0( 0/ 0)| 2370(1198/1172)| 1.272 +| sectors (r/w) | 76528(38520/38008)| 0( 0/ 0)| 18960(9584/9376)| 1.273 +| ratio to total | 76.8% | 0.0% | 23.2% | 1.274 + --------------------------------------------------------------------------- 1.275 +\end{verbatim} 1.276 + 1.277 +\paragraph{Результаты тестирования управления полосой пропускания для band-групп} 1.278 +Конфигурация для эксперимента \#3: 1.279 +\begin{itemize} 1.280 +\item Создать два раздела \texttt{sdb5} и \texttt{sdb6} 1.281 +\item Создать две дополнительные band-группы на \texttt{sdb5}, первая для \texttt{user1} и вторая для \texttt{user2}. 1.282 +\item Назначить веса 40, 20, 10 и 10 для band-групп \texttt{user1}, \texttt{user2}, default-групп разделов \texttt{sdb5} и \texttt{sdb6} соответственно 1.283 +\item Запустить 128 процессов, выполняющих одновременно случайные операции прямого чтения и прямой записи блоков размером 4KB 1.284 +\item Подсчитать количество выполненных операций в течение 60 секунд. 1.285 +\end{itemize} 1.286 + 1.287 +\begin{verbatim} 1.288 +результаты эксперимента #3 1.289 + --------------------------------------------------------------------------- 1.290 +|dev| sdb5 | sdb6 | 1.291 +|---+------------------------------------------------------+----------------| 1.292 +|usr| user1 | user2 | other users | all users | 1.293 +|wgt| 40 (50.0%) | 20 (25.0%) | 10 (12.5%) | 10 (12.5%) | 1.294 +|---+------------------+------------------+----------------+----------------| 1.295 +|I/O| 5951( 2940/ 3011)| 3068( 1574/ 1494)| 1663( 828/ 835)| 1663( 810/ 853)| 1.296 +|sec|47608(23520/24088)|24544(12592/11952)|13304(6624/6680)|13304(6480/6824)| 1.297 +| % | 48.2% | 24.9% | 13.5% | 13.5% | 1.298 + --------------------------------------------------------------------------- 1.299 +\end{verbatim} 1.300 + 1.301 +Конфигурация для эксперимента \#4: 1.302 +\begin{itemize} 1.303 +\item в точности такая же как для эксперимента \#3, за исключением того, что не запускаются процессы, работающие с band-группой \texttt{user2} 1.304 +\end{itemize} 1.305 + 1.306 +\begin{verbatim} 1.307 +результаты эксперимента #4 1.308 + --------------------------------------------------------------------------- 1.309 +|dev| sdb5 | sdb6 | 1.310 +|---+------------------------------------------------------+----------------| 1.311 +|usr| user1 | user2 | other users | all users | 1.312 +|wgt| 40 (50.0%) | 20 (25.0%) | 10 (12.5%) | 10 (12.5%) | 1.313 +|---+------------------+------------------+----------------+----------------| 1.314 +|I/O| 8002( 3963/ 4039)| 0( 0/ 0)| 2056(1021/1035)| 2008( 998/1010)| 1.315 +|sec|64016(31704/32312)| 0( 0/ 0)|16448(8168/8280)|16064(7984/8080)| 1.316 +| % | 66.3% | 0.0% | 17.0% | 16.6% | 1.317 + --------------------------------------------------------------------------- 1.318 +\end{verbatim} 1.319 + 1.320 +\paragraph{Выводы} 1.321 +\textbf{dm-band} работает хорошо при выполнении случайных операций чтение/запись. 1.322 +В будущем планируется провести тестирование на 1.323 +реальных приложениях, таких как СУБД и файловые серверы. 1.324 + 1.325 +\subsubsection{Почему нельзя было просто доработать CFQ?} 1.326 +В Linux есть механизмы для приоритезации дискового ввода/вывода. 1.327 +Почему нельзя было использовать их? 1.328 + 1.329 +Ниже перевод письма одного из соавторов dm-band Хироказу Такаши (Hirokazu Takashi) 1.330 +в список рассылки Xen-devel\url{http://lists.xensource.com/archives/html/xen-devel/2008-01/msg00852.html}, 1.331 +в котором он отвечает на этот вопрос. 1.332 + 1.333 +\begin{verbatim} 1.334 +From: Hirokazu Takahashi <taka@valinux.co.jp> 1.335 + 1.336 +Доработать стандартный планировщик ввода/вывода, который есть в ядре, 1.337 +это самый простой подход. Действительно, планировщик CFQ 1.338 +можно было бы научить управлять полосой пропускания путём 1.339 +относительного небольшой модификации кода. 1.340 +Оба подхода (использовать device-mapper и модифицировать CFQ) 1.341 +имеют свои плюсы и минусы. 1.342 + 1.343 +В настоящее время мы выбрали вариант с device-mapper по следующим причинам: 1.344 +* он может работать с любым планировщиком. Некоторые хотят использовать планировщик NOOP 1.345 + для работы с high-end хранилищами; 1.346 +* его должны использовать только те, кому нужно управление пропускной способностью I/O; 1.347 +* он независим от других планировщиков и его легко поддерживать; 1.348 +* не усложняется сопровождение CFQ. 1.349 + 1.350 +У сегодняшней реализации планировщика CFQ есть некоторые ограничения, 1.351 +которые мешают использовать его для управления полосой пропускания так, 1.352 +как хотелось бы. У планировщика есть только 7 уровней приоритета, 1.353 +что означает, что у него есть только 7 классов ввода/вывода. 1.354 +Если назначить один и тот же приоритет A нескольким виртуальным машинам, 1.355 +эти машины должны будут поровну делить полосу ввода/вывода, 1.356 +выделенную классу A. Если при этом есть машина, работающая с приоритетом B, 1.357 +более низким чем A, и она такая одна, может так получится, что у неё будет 1.358 +большая полоса пропускания чем у машин класса A. 1.359 + 1.360 +Вообще, я думаю, что нужно чтобы в CFQ был планировщик с двумя уровнями. 1.361 +Один уровень используется для выбора лучшей группы cgroup или работы (job), 1.362 +а второй — для выбора класса с наивысшим приоритетом ввода/вывода. 1.363 + 1.364 +Второй минус подхода с использованием существующего планировщика в том, 1.365 +что у него приоритеты ввода/вывода глобальны, 1.366 +и они распространяются на все диски, к которым осуществляется доступ. 1.367 +Нельзя сделать так, чтобы у задачи были разные приоритеты при доступе к разным дискам. 1.368 + 1.369 +У подхода с использованием device-mapper тоже есть свои минусы. 1.370 +Сложно получить информацию о возможностях и конфигурации нижележащих устройств, 1.371 +такую, например, как информацию о разделах и LUN. И возможно, потребуется разрабатывать 1.372 +дополнительные инструменты для настойки. 1.373 +\end{verbatim} 1.374 + 1.375 \subsection{Дополнительная информация} 1.376 \begin{itemize} 1.377 -\item Which is the fairest I/O scheduler of them all? (англ.) 1.378 -\item Планировщики ввода/вывода в Linux 1.379 -\item Choosing an I/O Scheduler for Red Hat® Enterprise Linux® 4 and the 2.6 Kernel (англ.) или на русском: Выбор планировщика ввода/вывода в Red Hat® Enterprise Linux® 4 и ядре версии 2.6 1.380 -\item CFQ IO Schedule и /proc/sys/{\dots} Или как уменьшить тормоза при интенсивной работе с диском 1.381 +\item \htmladdnormallinkfoot{Приоритезация ввода/вывода в Xen с помощью планировщика CFQ}{http://xgu.ru/wiki/xen/io} (рус.) 1.382 +\item \htmladdnormallinkfoot{Приоритезация ввода/вывода с помощью dm-band}{http://xgu.ru/wiki/dm-band} (рус.) 1.383 \end{itemize} 1.384 -