Perfomance-Aspekte bei der Virtualisierung

Etwas überrascht habe ich von einem Kollegen erfahren, dass es Firmen gibt die ihre Server mit VirtualBox statt mit den übliche Verdächtigen wie VMware, Xen, KVM, … virtualisieren. VirtualBox war bei mir irgendwie nur für virtuelle Maschinen auf dem Desktop abgespeichert. Offenbar ist VirtualBox aber so hochperformant, dass es locker mithält bzw. im Vergleich stellenweise sogar schneller ist.

In diesem Zusammenhang übermittelte der Kollege mir auch die Website http://www.ilsistemista.net. Dort hat es einige sehr gute Artikel zu Performance-Unterschiede diverser Lösungen – und das mit umfangreichen Tests belegt.

Sehr geholfen hat mir z.B. diese beiden Artikel (KVM I/O slowness on RHEL 6 und KVM vs VirtualBox 4.0 on RHEL 6). Fazit für KVM in aller Kürze:

  1. Unbedingt auf dem Hostrechner das Caching für die virtuellen Festplatten abschalten. Das gilt insbesondere für die zweite und alle weiteren Festplatten – bei der ersten macht es RedHat von selbst. Konnte ich prompt nachvollziehen!
  2. Bei Verwendung von Dateien zur Verwendung als virtuelle Festplatte im Gastsystem sollten die Dateien komplett vorangelegt werden damit der ganze Plattenplatz schon reserviert ist. Der Virtual-Machine-Manager tut das nämlich nicht und die Performance ist dann liederlich. Da ich dem VirtManager eine LVM-Physical VG für die Gäste gegeben habe, war ich zumindest nicht in diese Falle getappt.

Aber ggf. selbst die obigen Quellen nachlesen – lohnt sich!

Für Tests mit der Netzwerkperformance eignet sich iperf zu dem es hier ein ganz brauchbares Tutorial gibt -> http://openmaniak.com/iperf.php.

Eth-NICs bei Scientifc Linux 6 ändern, NetworkManager disablen

Ähnlich wie bei anderen Linux-Distributionen arbeitet bei SL6 das udev-System im Hintergrund und protokolliert z.B. die gefunden Netzwerkkarten mit. Die entsprechenden Einträge findet man in der Datei /etc/udev/rules.d/70-persistent-net.rules. Neben den MAC-Adressen der gefunden Ethernet-Schnittstellen wird hier auch dauerhaft der Name für eine Schnittstelle vergeben. Ein Eintrag sieht z.B. so aus:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:33:44:55:66", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Wird nun diese Karte ausgetauscht, entweder durch Hardwaretausch oder als neue virtuelle Schnittstelle in KVM, wird der bisherige Eintrag nicht gelöscht! Statt dessen werden neu identifizierte NICs zusätzlich eingetragen. Der Device-Namen wird dabei hochgezählt.

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:33:44:55:66", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"SUBSYSTEM==“net“, ACTION==“add“, DRIVERS==“?*“, ATTR{address}==“00:22:33:44:55:77″, ATTR{type}==“1″, KERNEL==“eth*“, NAME=“eth1″

Im System ändert sich somit die Device-Bezeichnung. Möchte man dies vermeiden und damit die Device-Bezeichnungen selbst kontrollieren, ist die Zeile der entfernten Karte zu löschen und der NAME-Parameter der verbleibenden Karte anzupassen. Alternativ kann man alle Zeilen löschen, womit die vorhandene Karte beim Reboot – der nun ohnehin fällig wird – vom udev-System neu eingepflegt wird.

Zu beachten ist, dass die MAC-Adresse auch in der Konfigurationsdatei für die entsprechende Schnittstelle zu finden ist. Diese Konfigurationsdateien finden sich bei SL6 unter /etc/sysconfig/network-scripts/ und tragen z.B. die Bezeichnung ifcfg-eth0. Im Inhalt

HWADDR=00:22:33:44:55:66
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=eth0
UUID=a69d030d-46ce-4eb2-af79-f18eb13478db
ONBOOT=yes

findet sich die MAC-Adresse wieder. Auch hier muss somit bei Manipulationen an der 70-persistent-net.rules eine Änderung erfolgen.

NetworkManager deaktivieren

Bei einer Standard-Installation werden die Netzwerkkarten automatisch vom NetworkManager kontrolliert. Soll der Betrieb der Netzwerkkarten klassisch über ein Boot-Skript vorgenommen werden, ist für die Konfiguration weiterhin die Datei /etc/sysconfig/network-scripts/ifcfg-eth0 zuständig.

Eine Möglichkeit diese Datei für den Betrieb ohne NetworkManager vorzubereiten ist die Konfiguration der Schnittstelle über die grafische Oberfläche – Alternative natürlich mit einem Texteditor auf Shellebene. Insbesondere der Eintrag NM_CONTROLLED=no kann nur mit dem Texteditor vorgenommen werden! Die Datei könnte danach also so aussehen.

HWADDR=52:54:00:DE:21:0C
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.200.10
PREFIX=28
GATEWAY=192.168.200.1
DNS1=192.168.200.1
DOMAIN=hier-ihre-domain.de
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=eth0
UUID=a69d030d-46ce-4eb2-af79-f18eb13478db
ONBOOT=yes
LAST_CONNECT=1315589539
NM_CONTROLLED=no

Nun ist noch der NetworkManager aus dem Boot-Prozess zu entfernen. Entweder wieder über das zugehörige GUI-Utility oder über den Shell-Befehl:

chkconfig --level 2345 NetworkManager off

Testen Sie anschließend über einen Reboot ob die Einstellungen greifen. Kontrollieren Sie insbesondere ob die Default-Route gesetzt ist und ob die Nameserver-Konfiguration stimmt.

[root@ldap network-scripts]# route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
192.168.200.0   0.0.0.0         255.255.255.240 U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.200.1   0.0.0.0         UG    0      0        0 eth0
[root@ldap network-scripts]# cat /etc/resolv.conf
nameserver 192.168.200.1
search
hier-ihre-domain.de

Siehe auch: http://www.convirture.com/wiki/index.php?title=RedHat_6_Networking

Shutdown von KVM-Gästen statt Suspend

Problem: In Scientifc Linux 6.1 – und da das wie CentOS von RHEL stammt vermutlich auch dort – werden virtuelle KVM-Gäste beim Shutdown der Wirtsmaschine in den Suspend-Modus gefahren. Ich hatte hier insbesondere mit der Uhrzeiteinstellung der Gäste beim Wiederanfahren ein Problem. Da diese glauben aus dem Suspend-Mode zu kommen behalten sie ihre Uhrzeit erst einmal bei. Der Versuch das mit NTP zu lösen hat leider nicht direkt nach einem Neustart geklappt.

Lösung: Unter http://raftaman.net/?p=995 fand ich die notwendigen Einstellungen um die virtuellen Maschinen beim Shutdown des Wirtsrechners ebenfalls wirklich Herunterzufahren, statt sie nur zu Suspenden. Die Einstellungen

ON_SHUTDOWN=shutdown
SHUTDOWN_TIMEOUT=60

sind in der Datei /etc/sysconfig/libvirt-guests vorzunehmen.

Dateisysteme virtueller Maschinen verwalten

Die nachfolgenden Angaben wurden unter folgender Umgebung getestet: Scientific Linux 6.1, Virtualisierung mit KVM.

Kommandozeilen-Werkzeuge im Paket libguestfs-tools

Das Paket libguestfs-tools enthält einige Werkzeuge mit der Dateisysteme virtueller Maschinen analysiert oder verändert werden können. Insbesondere die Größenänderung einers Plattenimages und der enthaltenen Dateisysteme wird damit leicht ermöglicht. Es enthält auch Werkzeuge um Dateien in diesen Dateisystemen anzuzeigen, zu editieren, zu sichern, … . Nachfolgend ein kurzer Überblick in dem die Anwendung einiger der Werkzeuge kurz demonstriert wird – und eine Demonstration einer Plattenimage-Größenänderung.

virt-df zeigt den freien Platz in den Dateisystemen einer virtuellen Maschine an. Im Gegensatz zu anderen Werkzeugen zeigt es nicht nur den einer virtuellen Maschine zugeordneten Plattenplatz an, sondern kann in die virtuelle Maschine „hineinsehen“ um den dort wirklich belegten Platz anzuzeigen. Es ist mit dem Kommando df(1)vergleichbar, arbeitet aber auf dem Dateisystem virtueller Maschinen und arbeitet sogar für virtuelle Windows-Maschinen.

Beispiel:
[root@dellserv ~]# virt-df -d test.serv.private
Using CPU model "cpu64-rhel6"
Filesystem                                1K-blocks       Used  Available  Use%
test.serv.private:/dev/sda1                  154691      29539     117165   20%
test.serv.private:/dev/system/root          4725116    3756100     728992   80%

virt-filesystems ist ein Kommandozeilen-Werkzeug um die Dateisysteme, Partitionen, Block-Geräte, logischen Volumes (LVs), Volume-Gruppen (VGs) und physikalischen Volumes (PVs) im Plattenimage einer virtuellen Maschine anzuzeigen.

Beispiel:
[root@dellserv ~]# virt-filesystems --long -h --all -d test.serv.private
Using CPU model "cpu64-rhel6"
Name              Type        VFS   Label  Size  Parent
/dev/sda1         filesystem  ext4  -      156M  -
/dev/system/root  filesystem  ext4  -      4,6G  -
/dev/system/swap  filesystem  swap  -      148M  -
/dev/system/root  lv          -     -      4,6G  /dev/system
/dev/system/swap  lv          -     -      148M  /dev/system
/dev/system       vg          -     -      4,7G  -
/dev/sda2         pv          -     -      4,7G  -
/dev/sda1         partition   -     -      156M  /dev/sda
/dev/sda2         partition   -     -      4,7G  /dev/sda
/dev/sda          device      -     -      4,9G  -

Mit virt-ls können Dateilistings innerhalb einer virtuellen Maschine angezeigt werden.

Beispiel:
[root@dellserv ~]# virt-ls -d test.serv.private -l /boot
Using CPU model "cpu64-rhel6"
total 23722
drwxr-xr-x  4 root root     1024 Nov  4 10:40 .
drwxr-xr-x 23 root root     4096 Nov  5 10:03 ..
-rw-r--r--  1 root root  2247048 Jul 26 19:12 System.map-2.6.37.6-0.7-desktop
-rw-------  1 root root      512 Aug 21 17:26 backup_mbr
lrwxrwxrwx  1 root root        1 Mar  2  2011 boot -> .
-rw-r--r--  1 root root     1236 Feb 21  2011 boot.readme
-rw-r--r--  1 root root   120322 Jul 26 18:24 config-2.6.37.6-0.7-desktop
drwxr-xr-x  2 root root     1024 Aug 21 17:51 grub
lrwxrwxrwx  1 root root       27 Aug 21 17:53 initrd -> initrd-2.6.37.6-0.7-desktop
-rw-r--r--  1 root root 11299312 Aug 21 17:53 initrd-2.6.37.6-0.7-desktop
drwx------  2 root root    12288 Aug 21 17:13 lost+found
-rw-r--r--  1 root root   553984 Nov  4 10:40 message
-rw-r--r--  1 root root   196515 Jul 26 19:23 symvers-2.6.37.6-0.7-desktop.gz
-rw-r--r--  1 root root  5294771 Jul 26 19:22 vmlinux-2.6.37.6-0.7-desktop.gz
lrwxrwxrwx  1 root root       28 Aug 21 17:51 vmlinuz -> vmlinuz-2.6.37.6-0.7-desktop
-rw-r--r--  1 root root  4555104 Jul 26 19:12 vmlinuz-2.6.37.6-0.7-desktop

Mit virt-cat kann der Inhalt einer Datei im Plattenimage einer virtuellen Maschine angezeigt werden.

Beispiel:
[root@dellserv ~]# virt-cat test.serv.private /boot/boot.readme
Using CPU model "cpu64-rhel6"
This file is for first help if you occur some problems during booting.

FAQ

Aber nicht nur das Anzeigen eines Datei-Inhalts ist möglich. Mit virt-edit können Dateien im Dateisystem einer virtuellen Maschine auch direkt vom Host-System aus editiert werden. ACHTUNG: Das sollte Sie auf keinen Fall in einer laufenden VM durchführen – Sie sollten die VM vorher immer herunter fahren.

Beispiel:
[root@dellserv ~]# virt-edit test.serv.private /boot/boot.readme

Dieses Kommando öffnet die Datei /boot/boot.readme der VM entweder in vi oder im Editor der durch die Umgebungsvariable EDITOR festgelegt ist.

virt-rescue stellt eine Rettungs-Shell bzw. ein Rettungssystem für interaktive Fixes an einer virtuellen Maschine zur Verfügung. Nach einem kurzen „Bootvorgang“ eines „Rettungs-Systems“ steht eine virtuelle Rettungs-Shell zur Verfügung. Mit dem mount-Befehl kann dann z.B. die Systemplatte der virtuellen Maschine nach /sysrootgemountet und anschließend bearbeitet werden.

Resizing eines Platten-Images eine virtuellen Maschine

Hierfür wird virt-resize verwendet. Dieses Werkzeug verändert aber nie das Original-Plattenimage! Sie müssen deshalb vorab ein neues Plattenimage in der gewünschten Größe anlegen. Damit das neue Plattenimage dann aber direkt in der bereits definierten VM verwendet werden kann, sollte es den gleichen Namen haben wie das bisherige. Deshalb wird zuerst das alte Image umbenannt. Im Fall eines Logical Volumes (LV) als Plattenimage geht das so:

[root@dellserv ~]# lvrename /dev/dataraid/test.serv.private \
/dev/dataraid/test.serv.private.bak
Renamed "test.serv.private" to "test.serv.private.bak" in volume group "dataraid"

Anschließend wird das neue Plattenimage als neues Logical Volume in der gewünschten Größe erstellt. Hier wird dafür der Name des bisherigen Plattenimages (test.serv.private) verwendet und das neue Volume in der gleichen Volume Group (VG dataraid) erstellt:

[root@dellserv ~]# lvcreate -L 6GB -n test.serv.private dataraid
Logical volume "test.serv.private" created

Anschließend wird das alte Plattenimage /dev/dataraid/test.serv.private.bak in das neue Plattenimage /dev/dataraid/test.serv.private übertragen. Der--expand-Parameter sorgt in diesem Beispiel dafür, dass der neu zur Verfügung stehende Platz komplett der Partition /dev/sda2 zugeschlagen wird. Da /dev/sda2außerdem ein Physical Volume der virtuellen Maschine ist, wird dieses (virtuelle) Physical Volume gleich ebenfalls in der Größe verändert.

[root@dellserv ~]# virt-resize --expand /dev/sda2 \
/dev/dataraid/test.serv.private.bak \
/dev/dataraid/test.serv.private
Using CPU model "cpu64-rhel6"
Summary of changes:
/dev/sda1: partition will be left alone
/dev/sda2: partition will be resized from 4.7G to 5.8G
/dev/sda2: content will be expanded using the 'pvresize' method
Copying /dev/sda1 ...
[############################################################################]
Copying /dev/sda2 ...
[############################################################################]
Using CPU model "cpu64-rhel6"
Expanding /dev/sda2 using the 'pvresize' method

Damit wurde das Plattenimage und das in /dev/sda2 enthaltene Physical Volume vergrößert. Das Logical Volume der virtuellen Maschine allerdings noch nicht. Nach dem Booten der virtuellen Maschine kann dies z.B. wie folgt erfolgen:

test:/usr/share/man # lvresize -l +100%FREE /dev/system/root
Extending logical volume root to 5,70 GiB
Logical volume root successfully resized

Eine Kontrolle der Auswirkung im Dateisystem zeigt aber erst keine Änderung an – der neue Platz ist nicht verfügbar.

test:~ # df -h
Dateisystem          Größe Benut  Verf Ben%% Eingehängt auf
rootfs                4,6G  3,6G  712M  84% /
devtmpfs              493M  116K  493M   1% /dev
tmpfs                 499M  4,0K  499M   1% /dev/shm
/dev/mapper/system-root
4,6G  3,6G  712M  84% /
/dev/vda1             152M   29M  115M  21% /boot

Dazu muss erst noch das enthaltene Dateisystem in der Größe geändert werden (siehe dazu auch den LVM Resizing Guide von Tom Hirt).

test:~ # resize2fs -p /dev/mapper/system-root
resize2fs 1.41.14 (22-Dec-2010)
Das Dateisystem auf /dev/mapper/system-root ist auf / eingehängt; Online-Grössenveränderung nötig
old desc_blocks = 1, new_desc_blocks = 1
Führe eine Online-Grössenänderung von /dev/mapper/system-root auf 1494016 (4k) Blöcke durch.
Das Dateisystem auf /dev/mapper/system-root ist nun 1494016 Blöcke groß.

Anschließend ist der freie Platz auch im Dateisystem sicht- und verfügbar.

test:~ # df -h
Dateisystem          Größe Benut  Verf Ben%% Eingehängt auf
rootfs                5,7G  3,6G  1,8G  68% /
devtmpfs              493M  116K  493M   1% /dev
tmpfs                 499M  4,0K  499M   1% /dev/shm
/dev/mapper/system-root
5,7G  3,6G  1,8G  68% /
/dev/vda1             152M   29M  115M  21% /boot

Weitere Werkzeuge im Paket libguestfs-tools:

  • virt-inspector untersucht eine virtuelle Maschine und versucht Details der VM zu erkennen. Dies beinhaltet die Betriebssystem-Version, die Kernel-Version, die installierten Treiber, ob die VM voll-virtualisiert (FV) oder teil-virtualisiert (PV) ist, welche Anwendungen installiert sind und weiteres.
  • virt-list-filesystems kann dazu verwendet werden die Dateisysteme im Platten-Image einer virtuellen Maschine aufzulisten (z.B. für die Weiterverwendung in Shell-Skripten, … ).
  • virt-list-partitions kann dazu verwendet werden die Partitionen im Platten-Image einer virtuellen Maschine aufzulisten.
  • virt-make-fs erlaubt auf Basis einer Dateisammlung oder eines tar-Archivs die Erstellung eines Dateisystems.
  • virt-tar ist ein Archivierungs-, Backup- und Upload-Werkzeug für das Dateisystem virtueller Maschinen.
  • virt-win-reg erlaubt es Ihnen in die Windows Registry von virtuellen Windows Maschinen hinein zu sehen.