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 -