xg-scale

annotate xen/io.tex @ 5:75853b740e5a

Добавлен подраздел про dm-band и исправлены небольшие опечатки касающиеся использования CFQ
author Igor Chubin <igor@chub.in>
date Sun Jul 06 23:46:33 2008 +0300 (2008-07-06)
parents 4730a0d07d88
children
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}