Opisałem jakiś czas temu wymianę dysków w domU, tym razem krótka wzmianka jak zmienić (zwiększyć / zmniejszyć) wielkość pamięci.
Maszynom wirtualnym przydzielam zawsze minimum zasobów. Zwłaszcza, że zazwyczaj działa tam jedna niekrytyczna usługa. Niemniej, sporadycznie trzeba wykonać operację, która może spowodować swap’owanie. Niekrytyczne serwery można restartować, a pamięć zmieniać w konfiguracji, ale można też wygodniej – xm set-mem.
Pamięć (określoną przez memory_dynamic_max) możemy zwiększać do wartości memory_static_max. Jest to wartość ustawiona w pliku konfiguracyjnym (parametr memory), bądź z wiersza poleceń – xm mem-max. W pierwszym przypadku oprócz ustalenia poziomu maksymalnego ustawiamy wielkość, z którą będzie pracował serwer już po uruchomieniu. W drugim – aby serwer ‘zobaczył’ więcej pamięci trzeba wywołać dodatkowo polecenie xm mem-set.
Pamiętać należy, że mem-max nie jest w żaden sposób sprawdzane, bo nie alokuje żadnej pamięci. Tym samym możemy ustawić limit wyższy niż w ogóle mamy do dyspozycji. Zakończyć się to może tak:
ksenofil ~ # xm mem-max dns-recursor 8192
ksenofil ~ # xm mem-set dns-recursor 8192
Error: I need 7340032 KiB, but dom0_min_mem is 200704 and shrinking to 200704 KiB would leave only 3724928 KiB free.
W przypadku, gdy będziemy chcieli przekroczyć wartość mem-max dostaniemy błąd:
Error: memory_dynamic_max must be less than or equal to memory_static_max
Nadal używam wersji 3.x Xen’a (3.4.2-r1 w Gentoo). Być może w tym zakresie coś się w 4 zmieniło, ale obecnie po nieudanej operacji zwiększenia pamięci xm list błędnie raportuje pamięć zaalokowaną dla domU (u mnie pokazuje wielkość do jakiej chciałem zwiększyć – xm info i xm list to pokazuje po zsumowaniu odpowiednich kolumn).
ksenofil ~ # xm info
host : ksenofil.xxx.dmz
release : 2.6.31-xen-r11
version : #1 SMP Sat Feb 27 13:12:21 CET 2010
machine : x86_64
nr_cpus : 4
nr_nodes : 1
cores_per_socket : 4
threads_per_core : 1
cpu_mhz : 1995
hw_caps : bfebfbff:20100800:00000000:00000140:0004e33d:00000000:00000001:00000000
virt_caps : hvm
total_memory : 14330
free_memory : 4
node_to_cpu : node0:0-3
node_to_memory : node0:4
xen_major : 3
xen_minor : 4
xen_extra : .2
xen_caps : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
xen_scheduler : credit
xen_pagesize : 4096
platform_params : virt_start=0xffff800000000000
xen_changeset : unavailable
cc_compiler : gcc version 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5)
cc_compile_by : root
cc_compile_domain : (none)
cc_compile_date : Thu Jan 7 12:42:02 CET 2010
xend_config_format : 4
ksenofil ~ # xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 3829 4 r----- 909350.2
xxxxxxxxx_01 33 1280 2 -b---- 106500.2
dns 18 128 1 -b---- 15776.3
dns-recursor 40 8192 1 r----- 8071.6
xxxxx 34 768 1 -b---- 605828.6
mail-gw 20 384 1 -b---- 33474.0
mysql-sec 6 512 1 -b---- 19099.7
nagios 23 512 1 -b---- 485468.6
xxxxxx_01 31 1792 2 -b---- 204961.0
smsgw 13 2048 1 -b---- 1160099.3
xxxx 39 768 1 -b---- 49208.0
www-xxxxxx 26 1024 1 -b---- 43641.4
No i na koniec logi po zmianach:
[2010-06-14 15:26:18 4692] DEBUG (XendDomainInfo:1330) Setting memory maximum of domain dns-recursor (40) to 2048 MiB.
[2010-06-14 15:26:25 4692] DEBUG (XendDomainInfo:1303) Setting memory target of domain dns-recursor (40) to 1280 MiB.
[2010-06-14 15:26:25 4692] DEBUG (balloon:172) Balloon: 4736 KiB free; 0 to scrub; need 262144; retries: 20.
[2010-06-14 15:26:25 4692] DEBUG (balloon:187) Balloon: setting dom0 target to 3577 MiB.
[2010-06-14 15:26:25 4692] DEBUG (XendDomainInfo:1303) Setting memory target of domain Domain-0 (0) to 3577 MiB.
[2010-06-14 15:26:25 4692] DEBUG (balloon:166) Balloon: 262784 KiB free; need 262144; done.
Tu też mała uwaga – Setting memory target of domain pojawi się w xend.log niezależnie od wyniku operacji, bez żadnej adnotacji. Nie można się więc na tym opierać i traktować tej informacji jako pomyślnego wykonania operacji. Na szczęście xm poprawnie ustawia kod wyjścia, więc automatyzując jakieś procesy możemy się upewnić, że wszystko poszło jak należy.
Tagi: Xen