xg-scale

annotate xen/resources.tex @ 4:253d66dd74bb

Добавлено подробное описание управления памятью домена и выделением устройств домену
author Igor Chubin <igor@chub.in>
date Sun Jul 06 23:27:46 2008 +0300 (2008-07-06)
parents 4730a0d07d88
children 4a790b55d005
rev   line source
igor@4 1 \section{Распределение ресурсов между доменами Xen}
igor@0 2
igor@4 3 \subsection{Процессор}
igor@0 4 Виртуальные процессоры (VCPU) виртуальных машин автоматически распределяются
igor@0 5 планировщиком между доступными физическими процессорами.
igor@0 6 Назначать соответствие виртуального процесса реальному вручную не нужно.
igor@0 7 Однако, при возникновении такой необходимости,
igor@0 8 можно указать на каком процессоре будет выполняться виртуальный процессор.
igor@0 9 Это делается с помощью команды \textbf{xm vcpu-pin}.
igor@0 10
igor@4 11 Каждый домен характеризуется двумя числами — \textit{весом} (weight) и \textit{лимитом} (cap).
igor@0 12
igor@0 13 Домен с весом 512 получает на том же хосте в два раза больше
igor@0 14 процессорного времени чем домен с весом 256.
igor@0 15 Вес может изменяться в диапазоне от 1 до 65535,
igor@0 16 и он равен по умолчанию 256.
igor@0 17
igor@0 18 Значение лимита (cap) может использоваться для того чтобы указать максимальную величину
igor@0 19 процессорного времени, который может получить домен, даже в случае, если хост-система
igor@4 20 простаивает. Значение выражается в процентах: 100 это 1 физический процессор, 50 это половина процессора, 400 — 4 процессора и т.д.
igor@0 21 Значение по умолчанию равно 0, что означает, что верхнее ограничение отсутствует.
igor@0 22
igor@0 23 Значения лимита и веса можно просматривать и модифицировать с помощью команд:
igor@0 24
igor@0 25 \begin{itemize}
igor@4 26 \item \textbf{xm sched-credit -d domain} — показать значение вес (weight) и верх (cap) для домена;
igor@4 27 \item \textbf{xm sched-credit -d domain -w weight} — установить вес равным \textbf{weight};
igor@4 28 \item \textbf{xm sched-credit -d domain -c cap} — установить верх равным \textbf{cap}.
igor@0 29 \end{itemize}
igor@0 30
igor@4 31 Для того чтобы эти значения сохранялись и после перезапуска домена,
igor@0 32 их нужно указать в конфигурационном файле
igor@0 33 с помощью параметров:
igor@0 34 \begin{itemize}
igor@4 35 \item \texttt{cpu\_cap} — верх (по умолчанию 0)
igor@4 36 \item \texttt{cpu\_weight} — вес (по умолчанию 256)
igor@0 37 \end{itemize}
igor@0 38
igor@4 39 \subsection{Оперативная память}
igor@4 40 Объём памяти, выделяемой домену 0, задаётся как параметр \textbf{dom0\_mem} гипервизора Xen.
igor@4 41 В этом случае подразумевается, что объём памяти
igor@4 42 указан в килобайтах.
igor@0 43
igor@4 44 Пример секции конфигурационного файла \texttt{menu.lst} загрузчика GRUB:
igor@4 45
igor@4 46 \begin{verbatim}
igor@4 47 title Xen 3.2-1-i386 / Debian GNU/Linux, kernel 2.6.18-4-xen
igor@4 48 root (hd0,0)
igor@4 49 kernel /boot/xen-3.2-1-i386.gz dom0_mem=1200000
igor@4 50 module /boot/vmlinuz-2.6.18-4-xen-686 root=/dev/sda1 ro console=tty0
igor@4 51 module /boot/initrd.img-2.6.18-4-xen-686
igor@4 52 savedefault
igor@4 53 \end{verbatim}
igor@4 54
igor@4 55 В этом примере домен 0 при старте будет в объёме оперативной
igor@4 56 памяти до 1.2G.
igor@4 57
igor@4 58 По умолчанию (то есть, если параметр \texttt{dom0\_mem} не указан),
igor@4 59 домен 0 сначала получает весь доступный объём оперативной памяти,
igor@4 60 а потом, по мере необходимости, при старте других доменов, его начинают снижать.
igor@4 61 Это делает специально предназначенный для такой работы balloon-драйвер.
igor@4 62
igor@4 63 Снижение будет производиться до величины \texttt{dom0-min-mem},
igor@4 64 заданной в конфигурационном файле \texttt{/etc/xen/xend-config.sxp}.
igor@4 65 Здесь величина памяти указывается в мегабайтах.
igor@4 66 Если в качестве значения указан 0,
igor@4 67 уменьшение памяти домена 0 выполняться не будет.
igor@4 68
igor@4 69 Пример настройки:
igor@4 70
igor@4 71 \begin{verbatim}
igor@4 72 (dom0-min-mem 0)
igor@4 73 \end{verbatim}
igor@4 74
igor@4 75 Объём памяти, выделяемой остальным доменам (то есть, виртуальным машинам),
igor@4 76 задаётся в их конфигурационных файлах с помощью параметра \texttt{memory}.
igor@0 77 Параметр может быть указан с суффиксом B, K, M или G, что означает байты, килобайты, мегабайты или гигабайты соответственно.
igor@4 78 По умолчанию подразумевается, что в конфигурационном файле домена объём памяти указан в мегабайтах.
igor@0 79
igor@4 80 Впоследствии этот размер можно изменить прямо для работающего
igor@4 81 домена при помощи команды:
igor@0 82
igor@4 83 \begin{verbatim}
igor@4 84 xm mem-set <domain-id> <mem>
igor@4 85 \end{verbatim}
igor@4 86
igor@4 87 Подняться выше заданного в конфигурационном файле значения без дополнительных
igor@4 88 хитростей не получится.
igor@4 89 Самая простая хитрость — задавать при старте домена большое значение памяти,
igor@4 90 потом его сразу же снижать, а потом повышать по мере необходимости.
igor@4 91
igor@4 92 Более правильный способ — использовать параметр конфигурационного файла домена \texttt{maxmem},
igor@4 93 и передавать ядру гостевой системы (при условии что это Linux) параметр \texttt{mem}:
igor@4 94
igor@4 95 \begin{verbatim}
igor@4 96 $ grep mem /etc/xen/dhcp
igor@4 97 memory = 128
igor@4 98 maxmem = 512
igor@4 99 extra = "mem=512M"
igor@4 100 \end{verbatim}
igor@4 101
igor@4 102 Система при старте получает 128 MB ОЗУ,
igor@4 103 но она сможет корректно отработать увеличение
igor@4 104 памяти до 512 MB.
igor@4 105
igor@4 106 \begin{verbatim}
igor@4 107 $ sudo xm create dhcp
igor@4 108 Using config file "/etc/xen/dhcp".
igor@4 109 Started domain dhcp
igor@4 110
igor@4 111 $ sudo xm list
igor@4 112 Name ID Mem VCPUs State Time(s)
igor@4 113 Domain-0 0 1171 1 r----- 5274.5
igor@4 114 dhcp 8 128 1 -b---- 2.8
igor@4 115 \end{verbatim}
igor@4 116
igor@4 117 Гостевая операционная система видит 128MB:
igor@4 118
igor@4 119 \begin{verbatim}
igor@4 120 $ sudo xm console dhcp
igor@4 121 Debian GNU/Linux lenny/sid dhcp tty1
igor@4 122
igor@4 123 dhcp login: root
igor@4 124 Password:
igor@4 125
igor@4 126 dhcp:~# free
igor@4 127 total used free shared buffers cached
igor@4 128 Mem: 131220 33132 98088 0 1524 12204
igor@4 129 -/+ buffers/cache: 19404 111816
igor@4 130 Swap: 0 0 0
igor@4 131 \end{verbatim}
igor@4 132
igor@4 133 Увеличиваем объём доступной домену оперативной памяти:
igor@4 134
igor@4 135 \begin{verbatim}
igor@4 136 %$ sudo xm mem-set dhcp 256
igor@4 137 %$ sudo xm list
igor@4 138 Name ID Mem VCPUs State Time(s)
igor@4 139 Domain-0 0 1171 1 r----- 5329.8
igor@4 140 dhcp 8 256 1 -b---- 2.9
igor@4 141 \end{verbatim}
igor@4 142
igor@4 143 Гостевая операционная система теперь видит 256MB:
igor@4 144
igor@4 145 \begin{verbatim}
igor@4 146 $ sudo xm console dhcp
igor@4 147
igor@4 148 dhcp:~#
igor@4 149 dhcp:~#
igor@4 150 dhcp:~# free
igor@4 151 total used free shared buffers cached
igor@4 152 Mem: 262144 33336 228808 0 1620 12228
igor@4 153 -/+ buffers/cache: 19488 242656
igor@4 154 Swap: 0 0 0
igor@4 155 \end{verbatim}
igor@4 156
igor@4 157 В настоящий момент изменение памяти на лету \textit{НЕ} поддерживает
igor@4 158 ядро Linux, работающее через \textit{pv-ops}.
igor@4 159 Это означает, в частности, что паравиртуальные ядра 2.6.24 и 2.6.25
igor@4 160 не смогут увидеть изменение памяти в домене.
igor@4 161
igor@4 162 \subsection{Распределение устройств}
igor@4 163 В режиме нормальной работы Xen-инсталляции все устройства (дисковая подсистема, сетевые адаптеры и проч.)
igor@4 164 видны напрямую только домену 0.
igor@4 165 Гостевые домены могут пользоваться этими устройствами,
igor@4 166 но не напрямую, а только опосредованно,
igor@4 167 при помощи механизмов, предоставляемых доменом 0.
igor@4 168
igor@4 169 В некоторых случаях, однако, бывает необходимо чтобы гостевой
igor@4 170 домен увидел устройство сам, без посредников.
igor@4 171 Такое, в частности, возможно, когда гостевая система
igor@4 172 должна использовать специфический драйвер для доступа
igor@4 173 к специальным функциям устройства, недоступным через паравиртуальный
igor@4 174 интерфейс.
igor@4 175
igor@4 176 Для проброса PCI-устройств необходимо чтобы:
igor@0 177 \begin{itemize}
igor@4 178 \item в ядре привилегированного домена (домена 0) присутствовала поддержка PCI backend;
igor@4 179 \item в ядрах, которые будут запускаться в пользовательских доменах и которые собираются использовать PCI-устройства, присутствовала поддержка PCI frontend.
igor@4 180 \end{itemize}
igor@4 181 В XenLinux PCI backend включается в конфигурационной секции Xen,
igor@4 182 а PCI frontend включается в зависимой от архитектуры секции \dq{}Bus Options\dq{}.
igor@4 183 Можно вкомпилировать вместе в одно ядро поддержку backend\rq{}а и поддержку frontend\rq{}а. Они друг другу не мешают.
igor@4 184 Обычно в ядрах, которые входят в состав распространённых дистрибутивов,
igor@4 185 поддержка есть по умолчанию.
igor@4 186
igor@4 187 PCI-устройство, которое передаётся непривилегированному домену,
igor@4 188 должно быть скрыто от backend-домена (обычно домена 0) —
igor@4 189 не должно так получиться, что домен 0 загрузит случайно драйвер устройства,
igor@4 190 и тот начнём работать с этим устройством.
igor@4 191
igor@4 192 Для этого нужно указать PCI backend, какое устройство он должен скрыть.
igor@4 193 Он привязывает себя как драйвер к устройству
igor@4 194 и тем самым гарантирует, что никакие другие драйверы устройств к нему не привяжутся.
igor@4 195 То есть, в действительности, устройства не скрываются от домена 0, просто они никак им не используются.
igor@4 196
igor@4 197 Информация о том, какое устройство должно скрываться,
igor@4 198 передаётся как параметр ядра \texttt{pciback.hide}
igor@4 199 в его командной строке, задающейся через загрузчик.
igor@4 200 PCI-устройства идентифицируются шестнадцатеричными числами слот/функция (slot/function),
igor@4 201 в Linux эти номера можно определить с помощью программы \textbf{lspci}.
igor@4 202 Их можно указывать с информацией о номере домена или без неё:
igor@4 203
igor@4 204 \begin{verbatim}
igor@4 205 (bus:slot.func) например (02:1d.3)
igor@4 206 (domain:bus:slot.func) например (0000:02:1d.3)
igor@4 207 \end{verbatim}
igor@4 208
igor@4 209 Пример параметров ядра Linux, скрывающих два PCI-устройства:
igor@4 210
igor@4 211 \begin{verbatim}
igor@4 212 root=/dev/sda4 ro console=tty0 pciback.hide=(02:01.f)(0000:04:1d.0)
igor@4 213 \end{verbatim}
igor@4 214
igor@4 215 Устройство можно отобрать у драйвера и скрыть его
igor@4 216 и без перезагрузки:
igor@4 217
igor@4 218 \begin{verbatim}
igor@4 219 # echo -n 0000:05:02.0 > /sys/bus/pci/drivers/3c905/unbind
igor@4 220 # echo -n 0000:05:02.0 > /sys/bus/pci/drivers/pciback/new_slot
igor@4 221 # echo -n 0000:05:02.0 > /sys/bus/pci/drivers/pciback/bind
igor@4 222 \end{verbatim}
igor@4 223
igor@4 224 Сначала устройство отвязывается от драйвера,
igor@4 225 который его держит.
igor@4 226 Затем оно привязывается к PCI backend.
igor@4 227
igor@4 228 Просмотреть к какому устройству привязан какой драйвер
igor@4 229 можно командой:
igor@4 230
igor@4 231 \begin{verbatim}
igor@4 232 %# ls -l /sys/bus/pci/devices/*/driver
igor@4 233 \end{verbatim}
igor@4 234
igor@4 235 После того как устройство освобождено от домена 0,
igor@4 236 его можно передавать внутрь гостевого домена.
igor@4 237 Для того чтобы передать устройство внутрь домена,
igor@4 238 в его конфигурационном файле нужно указать строку:
igor@4 239
igor@4 240 \begin{verbatim}
igor@4 241 pci=['05:02.0']
igor@4 242 \end{verbatim}
igor@4 243
igor@4 244 Когда гостевой домен будет запущен,
igor@4 245 проверить видит ли он проброшенное внутрь устройство,
igor@4 246 можно командой:
igor@4 247
igor@4 248 \begin{verbatim}
igor@4 249 %# lspci
igor@4 250 \end{verbatim}
igor@4 251
igor@4 252 \subsection{Дополнительная информация}
igor@4 253 \begin{itemize}
igor@4 254 \item \htmladdnormallinkfoot{Распределение ресурсов между доменами Xen}{http://xgu.ru/wiki/xen/resources} (рус.)
igor@0 255 \end{itemize}
igor@0 256