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
|