EnglischFranzösischSpanisch

Ad


OnWorks-Favicon

guestfs-performance – Online in der Cloud

Führen Sie „guestfs-performance“ beim kostenlosen Hosting-Anbieter OnWorks über Ubuntu Online, Fedora Online, den Windows-Online-Emulator oder den MAC OS-Online-Emulator aus

Dies ist der Befehl „guestfs-performance“, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann

PROGRAMM:

NAME/FUNKTION


guestfs-performance – Entwicklung von libguestfs für höchste Leistung

BESCHREIBUNG


Auf dieser Seite wird dokumentiert, wie Sie die größtmögliche Leistung aus libguestfs herausholen, insbesondere wenn
Sie gehen davon aus, dass Sie libguestfs verwenden werden, um Tausende von virtuellen Maschinen oder Festplatten-Images zu manipulieren.

Drei Hauptbereiche werden abgedeckt. Libguestfs führt eine Appliance aus (eine kleine Linux-Distribution)
innerhalb von qemu/KVM. Die ersten beiden Bereiche sind: Minimierung der dafür benötigten Zeit
Gerät und wie oft das Gerät gestartet werden muss. Der dritte Bereich ist
Verkürzung der für die Inspektion von VMs benötigten Zeit.

BASISLINIE MESSUNGEN


Bevor Sie Änderungen an der Verwendung von libguestfs vornehmen, nehmen Sie grundlegende Messungen vor.

Grundlinie: Beginnen Sie Gerät
Stellen Sie fest, wie lange es dauert, bis die Appliance auf einer unbelasteten Maschine hochgefahren ist:

time guestfish -a /dev/null ausführen

Führen Sie diesen Befehl mehrmals hintereinander aus und verwerfen Sie die ersten paar Durchläufe, damit Sie ihn erhalten
Messung eines typischen „Hot Cache“-Falls.

Erläuterung

Dieser Befehl startet die libguestfs-Appliance auf einer Nullfestplatte und fährt dann sofort herunter
es runter. Wenn Sie den Befehl zum ersten Mal ausführen, wird eine Appliance erstellt und zwischengespeichert
(normalerweise unter /var/tmp/.guestfs-*). Nachfolgende Ausführungen sollten die zwischengespeicherte Appliance wiederverwenden.

Voraussichtlich Ergebnisse

Sie sollten mit Zeiten unter 6 Sekunden rechnen. Wenn die Zeiten, die Sie auf einem sehen
Wenn sich die unbelastete Maschine darüber befindet, lesen Sie den Abschnitt „FEHLERBEHEBUNG BEI SCHLECHTER LEISTUNG“.
unten.

Grundlinie: Durchführen Inspektion of a Gast
Für diesen Test benötigen Sie eine entladene Maschine und mindestens ein echtes Gast- oder Festplatten-Image.
Wenn Sie planen, libguestfs nur für X-Gäste (z. B. X = Windows) zu verwenden, dann verwenden Sie
Ein X-Gast wäre hier am besten geeignet. Wenn Sie planen, libguestfs dagegen auszuführen
B. eine Gästemischung, dann verwenden Sie hier eine Gästemischung zum Testen.

Zeit, wie lange es dauert, die Inspektion durchzuführen und die Datenträger des Gastsystems zu mounten. Benutzen Sie die
den ersten Befehl, wenn Sie Disk-Images verwenden möchten, und den zweiten Befehl, wenn Sie dies wünschen
mit libvirt.

Zeit Guestfish --ro -a disk.img -i Exit

Zeit Guestfish --ro -d GuestName -i Exit

Führen Sie den Befehl mehrmals hintereinander aus und verwerfen Sie die ersten paar Durchläufe, damit Sie ihn erhalten
Messung eines typischen „Hot Cache“-Falls.

Erläuterung

Dieser Befehl startet die libguestfs-Appliance auf dem benannten Disk-Image oder libvirt-Gast.
führt eine libguestfs-Inspektion durch (siehe „INSPEKTION“ in Gastfs(3)), reitet den Gast
Festplatten, verwirft dann alle diese Ergebnisse und fährt herunter.

Wenn Sie den Befehl zum ersten Mal ausführen, wird eine Appliance erstellt und zwischengespeichert (normalerweise).
für /var/tmp/.guestfs-*). Nachfolgende Ausführungen sollten die zwischengespeicherte Appliance wiederverwenden.

Voraussichtlich Ergebnisse

Sie sollten mit Zeiten rechnen, die ≤ 5 Sekunden länger sind als die in der ersten Basislinie gemessenen
Test oben. (Wenn der erste Basistest beispielsweise in 5 Sekunden lief, dann dieser Test
sollte in ≤ 10 Sekunden laufen).

VERSTEHEN GERÄT UND WENN IT IS GEBAUT/GECACHT


Wenn Sie libguestfs zum ersten Mal verwenden, wird eine Appliance erstellt und zwischengespeichert. Dies ist normalerweise der Fall
in /var/tmp/.guestfs-*, es sei denn, Sie haben in diesem Fall $TMPDIR oder $LIBGUESTFS_CACHEDIR festgelegt
Es befindet sich in diesem temporären Verzeichnis.

Weitere Informationen zum Aufbau des Geräts finden Sie unter „SUPERMIN-GERÄTE“ in
Supermin(1).

Bei jeder Ausführung von libguestfs wird überprüft, ob keine von der Appliance verwendeten Hostdateien vorhanden sind
geändert. Wenn ja, dann wird das Gerät umgebaut. Dies geschieht normalerweise, wenn ein Paket
auf dem Host installiert oder aktualisiert wird (z. B. mit Programmen wie „yum“ oder „apt-get“). Der
Grund für den Umbau der Appliance ist die Sicherheit: das neue Programm
Das installierte Programm enthält möglicherweise einen Sicherheitsupdate, daher möchten wir das reparierte Programm in das Programm einbinden
Gerät automatisch.

Dies sind die Auswirkungen auf die Leistung:

· Der Prozess des Erstellens (oder Wiederherstellens) der zwischengespeicherten Appliance ist langsam, und das ist möglich
Vermeiden Sie dies, indem Sie ein fest installiertes Gerät verwenden (siehe unten).

· Wenn Sie keine feste Appliance verwenden, beachten Sie, dass die Aktualisierung der Software auf dem Host zu Problemen führen kann
ein einmaliger Umbau des Geräts.

· / var / tmp (oder $TMPDIR, $LIBGUESTFS_CACHEDIR) sollte sich auf einer schnellen Festplatte befinden und ausreichend vorhanden sein
Platz für das Gerät.

VERWENDUNG A FIXED GERÄT


Um den Zeitpunkt des Gerätebaus vollständig zu steuern, können Sie ein festes Gerät bauen. Das
Die Appliance sollte auf einer schnellen lokalen Festplatte gespeichert werden.

Führen Sie zum Erstellen der Appliance den folgenden Befehl aus:

libguestfs-make-fixed-appliance

Ersetzen von „ " mit dem Namen eines Verzeichnisses, in dem die Appliance gespeichert wird
(Normalerweise würden Sie ein Unterverzeichnis benennen, zum Beispiel: /usr/local/lib/guestfs/appliance or
/dev/shm/appliance).

Legen Sie dann $LIBGUESTFS_PATH fest (und stellen Sie sicher, dass diese Umgebungsvariable in Ihrem libguestfs festgelegt ist).
Programm) oder ändern Sie Ihr Programm so, dass es „guestfs_set_path“ aufruft. Zum Beispiel:

export LIBGUESTFS_PATH=/usr/local/lib/guestfs/appliance

Jetzt können Sie libguestfs-Programme, Virt-Tools, Guestfish usw. wie gewohnt ausführen. Die Programme
wird Ihre feste Appliance verwenden und niemals ihre eigene erstellen, neu erstellen oder zwischenspeichern
Gerät.

(Ausführliche Informationen zu diesem Thema finden Sie unter: libguestfs-make-fixed-appliance(1)).

Leistung of fixiert Gerät
Bei unseren Tests konnten wir feststellen, dass die Verwendung eines fest installierten Geräts keine messbaren Ergebnisse lieferte
Leistungsvorteil, auch wenn sich die Appliance im Speicher befand (d. h. eingeschaltet). / dev / shm).
Es sind jedoch zwei Punkte zu beachten:

1. Die Verwendung einer festen Appliance verhindert, dass libguestfs die Appliance jemals neu erstellt
dass libguestfs vorhersehbarere Startzeiten haben wird.

2. Das Gerät wird bei Bedarf geladen. Ein einfacher Test wie:

time guestfish -a /dev/null ausführen

belastet das Gerät nicht sehr stark. Ein echtes libguestfs-Programm mit komplizierter Verwendung
API-Aufrufe würden viel mehr von der Appliance beanspruchen. Speichern können
Durch die Platzierung des Geräts an einem bestimmten Standort wird die Leistung vorhersehbarer.

REDUZIEREN NUMBER OF TIMES GERÄT IS Gestartet


Der bei weitem effektivste, wenn auch nicht immer einfachste Weg, eine gute Leistung zu erzielen, ist
um sicherzustellen, dass das Gerät so oft wie möglich gestartet wird. Das wird wahrscheinlich der Fall sein
Dazu gehört auch, dass Sie Ihre libguestfs-Anwendung ändern.

Versuchen Sie, „guestfs_launch“ höchstens einmal pro virtueller Zielmaschine oder Festplatten-Image aufzurufen.

Anstatt eine separate Instanz von zu verwenden Gastfisch(1) eine Reihe von Änderungen vorzunehmen
Wenn Sie denselben Gast verwenden, verwenden Sie eine einzelne Instanz von Guestfish und/oder verwenden Sie Guestfish --hören .

Erwägen Sie, Ihr Programm als Daemon zu schreiben, der einen Gast offen hält, während er eine Serie erstellt
von Veränderungen. Oder organisieren Sie alle Vorgänge, die Sie ausführen möchten, bevor Sie den Gast öffnen.

Sie können auch versuchen, Festplatten von mehreren Gästen zu einer einzelnen Appliance hinzuzufügen. Bevor ich es versuche
Beachten Sie hierzu folgende Punkte:

1. Das Hinzufügen mehrerer Gäste zu einer Appliance stellt ein Sicherheitsproblem dar, da dadurch möglicherweise ein Gast zugelassen wird
Gast, um die Festplatten eines anderen Gastes zu stören. Tun Sie es nur, wenn Sie allen vertrauen
Gäste, oder ob Sie Gäste nach Vertrauen gruppieren können.

2. Es gibt eine feste Grenze für die Anzahl der Festplatten, die Sie einer einzelnen Appliance hinzufügen können. Forderung
„guestfs_max_disks“ in Gastfs(3) um dieses Limit zu erhalten. Weitere Informationen finden Sie unter
„GRENZEN“ in Gastfs(3).

3. Die Verwendung von libguestfs auf diese Weise ist kompliziert. Festplatten können unerwartete Wechselwirkungen haben: z
Wenn beispielsweise zwei Gäste dieselbe UUID für ein Dateisystem verwenden (weil sie geklont wurden),
oder Volume-Gruppen mit demselben Namen haben (siehe jedoch „guestfs_lvm_set_filter“).

virt-df(1) fügt standardmäßig mehrere Festplatten hinzu, daher wäre der Quellcode für dieses Programm a
guter Anfang.

VERKÜRZUNG ZEIT- TAKEN FÜR PRÜFUNG OF VMs


Der wichtigste Rat liegt auf der Hand: Führen Sie keine (kostspieligen) Inspektionen durch, es sei denn, dies ist erforderlich
die Ergebnisse.

Wenn Sie zuvor eine Inspektion des Gastes durchgeführt haben, ist es möglicherweise sicher, ihn zwischenzuspeichern
Verwenden Sie die Ergebnisse des letzten Mals erneut.

Einige Datenträger müssen überhaupt nicht überprüft werden, beispielsweise wenn Sie einen Datenträger erstellen
Image oder wenn das Disk-Image keine VM ist oder wenn das Disk-Image ein bekanntes Layout hat.

Auch wenn eine Basisinspektion („guestfs_inspect_os“) erforderlich ist, ist eine Zusatzinspektion erforderlich
Operationen können vermieden werden:

· Das Mounten von Datenträgern ist nur erforderlich, um weitere Informationen zum Dateisystem zu erhalten.

· Das Auflisten von Anwendungen („guestfs_inspect_list_applications“) ist ein kostspieliger Vorgang
unter Linux, aber fast kostenlos unter Windows.

· Das Generieren eines Gastsymbols („guestfs_inspect_get_icon“) ist unter Linux günstig, aber teuer
unter Windows.

PARALLEL HAUSHALTSGERÄTE


Libguestfs-Appliances sind größtenteils E/A-gebunden und Sie können mehrere Appliances starten
parallel. Sofern genügend freier Speicher vorhanden ist, sollte es kaum Unterschiede geben
Paralleles Starten von 1 Appliance im Vergleich zu N Appliances.

Auf einem 2-Core-Laptop (4 Threads) mit 16 GB RAM unter Verwendung des (nicht besonders realistischen) Tests
Perl-Skript unten, das folgende Diagramm zeigt eine hervorragende Skalierbarkeit bei der Ausführung zwischen 1
und 20 Geräte parallel:

12 ++---+----+----+----+-----+----+----+----+----+-- -++
+ + + + + + + + + + *
| |
| * |
11 ++ ++
| |
| |
| * * |
10 ++ ++
| * |
| |
s | |
9 ++ ++
e | |
| * |
c | |
8 ++ * ++
o | * |
| |
n 7 ++ ++
| * |
d | * |
| |
s 6 ++ ++
| * * |
| * |
| |
5 ++ ++
| |
| * |
| * * |
4 ++ ++
| |
| |
+ * * * + + + + + + + +
3 ++-*-+----+----+----+-----+----+----+----+----+-- -++
0 2 4 6 8 10 12 14 16 18 20
Anzahl paralleler Geräte

Es ist möglich, weit mehr als 20 Geräte parallel zu betreiben, aber wenn Sie das verwenden
libvirt-Backend, dann sollten Sie sich darüber im Klaren sein, dass libvirt standardmäßig die Anzahl begrenzt
Clientverbindungen auf 20.

Das folgende einfache Perl-Skript wurde verwendet, um die Daten für den obigen Plot zu sammeln, aber es gibt sie
viel mehr Informationen zu diesem Thema, einschließlich fortgeschrittenerer Testskripte und Grafiken,
verfügbar in den folgenden Blogbeiträgen:

http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-1/
http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-2/
http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-3/
http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-4/

#!/usr/bin/env perl

Verwenden Sie strenge;
Threads verwenden;
Warnungen verwenden;
benutze Sys::Guestfs;
use Time::HiRes qw(time);

Untertest {
my $g = Sys::Guestfs->new;
$g->add_drive_ro ("/dev/null");
$g->launch ();

# Sie könnten hier etwas Arbeit für libguestfs hinzufügen.

$g->close ();
}

# Alles in den Cache packen.
prüfen (); prüfen (); prüfen ();

für meine $nr_threads (1..20) {
mein $start_t = time ();
meine @threads;
foreach (1..$nr_threads) {
push @threads, threads->create (\&test)
}
foreach (@threads) {
$_->join ();
if (my $err = $_->error ()) {
die „Start fehlgeschlagen mit $nr_threads Threads: $err“
}
}
mein $end_t = time ();
printf ("%d %.2f\n", $nr_threads, $end_t - $start_t);
}

VERWENDUNG BENUTZERMODUS LINUX


Seit libguestfs 1.24 ist es möglich, das User-Mode Linux (uml)-Backend zu verwenden
anstelle von KVM (siehe „USER-MODE LINUX BACKEND“ in Gastfs(3)). Dieser Abschnitt macht einige
Allgemeine Bemerkungen zu diesem Backend, aber es ist so hoch ratsam um Ihre eigenen zu messen
Arbeitsbelastung unter UML, anstatt Kommentaren oder Intuition zu vertrauen.

· UML ist auf Bare-Metal in der Regel gleich oder etwas langsamer als KVM.

· Allerdings leistet UML unter Virtualisierung oft die gleiche Leistung wie auf Bare-Metal.
wohingegen KVM unter Virtualisierung viel langsamer laufen kann (da Hardware-Virt-Beschleunigung erfolgt).
ist nicht verfügbar).

· Das Hoch- und Herunterladen ist bei UML bis zu zehnmal langsamer als bei KVM. Libguestfs sendet
Diese Daten werden über den UML-emulierten seriellen Port übertragen, der weitaus weniger effizient ist als KVMs
virtio-seriell.

· In UML fehlen einige Funktionen (z. B. qcow2-Unterstützung), sodass es möglicherweise überhaupt nicht anwendbar ist.

Einige tatsächliche Zahlen finden Sie unter:
http://rwmj.wordpress.com/2013/08/14/performance-of-user-mode-linux-as-a-libguestfs-backend/# Content

FEHLERBEHEBUNG ARM LEISTUNG


Gewährleisten Hardware Virtualisierung is verfügbar
Verwenden Sie die / proc / cpuinfo und diese Seite:

http://virt-tools.org/learning/check-hardware-virt/

um sicherzustellen, dass Hardwarevirtualisierung verfügbar ist. Beachten Sie, dass Sie es möglicherweise aktivieren müssen
in Ihrem BIOS.

Hardware-Virt ist in VMs normalerweise nicht verfügbar und libguestfs wird darin langsam ausgeführt
eine andere virtuelle Maschine, was auch immer Sie tun. Die verschachtelte Virtualisierung funktioniert bei uns nicht gut
Erfahrung und ist sicherlich kein Ersatz für die Ausführung von libguestfs auf Bare-Metal.

Gewährleisten KVM is verfügbar
Stellen Sie sicher, dass KVM aktiviert und für den Benutzer verfügbar ist, der libguestfs ausführen wird. Es sollte
Stellen Sie sicher, dass Sie die 0666-Berechtigungen aktivieren /dev/kvm und die meisten Distributionen tun dies mittlerweile.

Prozessoren zu vermeiden
Vermeiden Sie Prozessoren ohne Hardwarevirtualisierung und einige Prozessoren mit Hardwarevirtualisierung
einfach sehr langsam (AMD Geode ist ein gutes Beispiel).

Xen dom0
In Xen ist dom0 eine virtuelle Maschine und daher ist keine Hardwarevirtualisierung verfügbar.

DETAILLIERTE ZEITEN VERWENDUNG TS


Verwenden Sie das ts(1) Befehl (von moreutils) zum Anzeigen detaillierter Zeitangaben:

$ Guestfish -a /dev/null run -v |& ts -i '%.s'
0.000022 libguestfs: launch: program=guestfish
0.000134 libguestfs: Start: Version=1.29.31fedora=23,release=2.fc23,libvirt
0.000044 libguestfs: Start: Backend registriert: Unix
0.000035 libguestfs: Start: Backend registriert: uml
0.000035 libguestfs: Start: Backend registriert: libvirt
0.000032 libguestfs: Start: Backend registriert: direkt
0.000030 libguestfs: launch: backend=libvirt
0.000031 libguestfs: Start: tmpdir=/tmp/libguestfsw18rBQ
0.000029 libguestfs: Start: umask=0002
0.000031 libguestfs: Start: euid=1000
0.000030 libguestfs: libvirt-Version = 1002012 (1.2.12)
[Etc.]

Die Zeitstempel sind Sekunden (inkrementell seit der vorherigen Zeile).

DETAILLIERTE ZEITEN VERWENDUNG SYSTEMTAP


Sie können SystemTap (tippe(1)), um detaillierte Timings von libguestfs-Programmen zu erhalten.

Speichern Sie das folgende Skript unter time.stap:

global zuletzt;

Funktion display_time () {
now = gettimeofday_us ();
Delta = 0;
if (last > 0)
Delta = jetzt – zuletzt;
last = jetzt;

printf ("%d (+%d):", now, delta);
}

Sondenbeginn {
zuletzt = 0;
printf ("bereit\n");
}

/* Alle Aufrufe an statische Markierungen anzeigen. */
Probe-Prozess("/ Usr / lib*/libguestfs.so.0")
.provider("guestfs").mark("*") ? {
Anzeigezeit();
printf ("\t%s %s\n", $$name, $$parms);
}

/* Alle Aufrufe von „guestfs_*“-Funktionen anzeigen. */
Probe-Prozess("/ Usr / lib*/libguestfs.so.0")
.function("guestfs_[az]*") ? {
Anzeigezeit();
printf ("\t%s %s\n", probefunc(), $$parms);
}

Führen Sie es als Root in einem Fenster aus:

# stap time.stap
bereit

Es wird „bereit“ gedruckt, wenn SystemTap das Programm geladen hat. Führen Sie Ihr libguestfs-Programm aus.
Guestfish oder ein Virt-Tool in einem anderen Fenster. Zum Beispiel:

$ Guestfish -a /dev/null ausführen

Im Stap-Fenster sehen Sie eine große Ausgabemenge mit der jeweils benötigten Zeit
Schritt angezeigt (Mikrosekunden in Klammern). Zum Beispiel:

xxxx (+0): Guestfs_create
xxxx (+29): Guestfs_set_pgroup g=0x17a9de0 pgroup=0x1
xxxx (+9): Guestfs_add_drive_opts_argv g=0x17a9de0 [...]
xxxx (+8): guestfs_int_safe_strdup g=0x17a9de0 str=0x7f8a153bed5d
xxxx (+19): Guestfs_int_safe_malloc g=0x17a9de0 nbytes=0x38
xxxx (+5): guestfs_int_safe_strdup g=0x17a9de0 str=0x17a9f60
xxxx (+10): Guestfs_launch g=0x17a9de0
xxxx (+4): launch_start
[Etc.]

Um es vollständig zu verstehen, müssen Sie die Quelle von libguestfs konsultieren und sogar ändern
die Ausgabe.

DETAILLIERTE FEHLERBEHEBUNG VERWENDUNG GDB


Sie können mithilfe von gdb eine Verbindung zum BIOS/Kernel der Appliance herstellen. Wenn Sie wissen, was Sie tun,
Dies kann eine nützliche Methode zur Diagnose von Boot-Regressionen sein.

Zuerst müssen Sie qemu so ändern, dass es mit den Optionen „-S“ und „-s“ läuft. Diese Optionen
Bewirken, dass qemu beim Booten anhält und Ihnen das Anschließen eines Debuggers ermöglicht. Lesen qemu(1) für weitere
Information. Libguestfs ruft qemu mehrmals auf (um die Hilfeausgabe zu scannen usw.)
und Sie möchten, dass diese Optionen nur beim letzten Aufruf von qemu verwendet werden, also verwenden Sie einen qemu-Wrapper
Skript wie folgt:

#!/ bin / bash -

# Stellen Sie dies so ein, dass es auf die echte qemu-Binärdatei zeigt.
qemu=/usr/bin/qemu-kvm

if [ "$1" != "-global" ]; Dann
# Hilfeausgabe usw. scannen.
exec $qemu „$@“
sonst
# Qemu läuft wirklich.
exec $qemu -S -s "$@"
fi

Führen Sie nun „guestfish“ oder ein anderes libguestfs-Tool mit dem qemu-Wrapper aus (siehe „QEMU-WRAPPERS“ in
Gastfs(3) um zu verstehen, was dies bewirkt):

LIBGUESTFS_HV=/path/to/qemu-wrapper guestfish -a /dev/null -v run

Dies sollte kurz nach dem Start von qemu pausieren. In einem anderen Fenster mit gdb eine Verbindung zu qemu herstellen:

$ gdb
(gdb) Set-Architektur i8086
Als Zielarchitektur wird i8086 angenommen
(gdb) Zielfernbedienung: 1234
Remote-Debugging mit :1234
0x0000fff0 in ?? ()
(gdb) Fortsetzung

An dieser Stelle können Sie Standard-GDB-Techniken verwenden, z. Drücken Sie „^C“, um den Startvorgang zu unterbrechen
und „bt“ erhalten einen Stack-Trace, setzen Haltepunkte usw. Beachten Sie, dass, wenn Sie vorbei sind
BIOS und im Linux-Kernel möchten Sie die Architektur wieder auf 32 oder 64 ändern
Bit.

Nutzen Sie „guestfs-performance“ online über die Dienste von onworks.net


Kostenlose Server & Workstations

Laden Sie Windows- und Linux-Apps herunter

Linux-Befehle

Ad