Verteilen Sie VirtualBox-VMs auf mehrere Kerne

Verteilen Sie VirtualBox-VMs auf mehrere Kerne

Ich verwende für die Entwicklung viele VirtualBox-VMs mit unterschiedlichen Betriebssystemen auf einem Ubuntu-Linux-Host. Manchmal funktionieren meine Skripte nicht richtig und laden 100 % der VM-CPU. Und wenn eine VM 100 % der CPU-Leistung auslastet, kann ich nicht einmal das Hostsystem verwenden – es ist langsam!

Dann muss ich (sehr langsam) die Oberseite öffnen, sehen, dass der VirtualBox-Prozess 240 % der CPU nutzt, dann jedes VM-Fenster öffnen, bis ich die VM finde, die die CPU auslastet, und den Prozess beenden. Ich möchte nicht den gesamten VirtualBox-Prozess beenden, der so viel CPU nutzt.

Alle meine VMs sind so konfiguriert, dass sie nur einen CPU-Kern verwenden, mit einer Ausführungsbegrenzung von 100 %. Meine CPU ist AMD FX 8370 (8 Kerne, 16 Threads), mein Host läuft auf SSD RAID 10 mit korrekt ausgerichteten Dateisystemen. Befinde ich mich in einer Windows-Hostumgebung? Natürlich nicht! Warum kommt es dann zu Verlangsamungen?

Vielleicht, weil allen VirtualBox-VMs nur der erste Kern zugewiesen wird (wie es bei Windows normalerweise der Fall ist)? Wie kann man das überprüfen und wie kann man dafür sorgen, dass jede VM jeden Kern verwendet? Vielleicht gibt es noch andere Vermutungen?

Vielleicht lautet die Frage einfach: Wie weise ich in Linux eine beliebige App einem bestimmten Kern zu?

Antwort1

Ich habe keine Antwort auf Ihre Frage, aber ich kann zumindest Ihren Schmerz lindern.

Wenn Sie jede VM über die Kommandozeile starten, zum Beispiel wie

VBoxManage startvm Name_of_VM --type headless

-cdann zeigt der oberste Befehl mit der Option auch den vollständigen Befehl an, der den Prozess gestartet hat. Auf diese Weise können Sie den verantwortlichen Prozess sofort identifizieren und ihn mit der kOption topselbst beenden (Sie müssen die Nummer des Prozesses angeben, den Sie beenden möchten und den Sie gerade identifiziert haben).

Das Gute daran ist, dies funktioniert auch, wenn Sie alle Ihre VMs über die GUI und nicht über die CLI starten.

BEARBEITEN:

Wenn ich es mir recht überlege, weiß ich vielleicht die Antwort auf Ihre Frage. Ich bin mir nicht sicher, ob es wirklich das ist, wonach Sie suchen. In diesem Fall sagen Sie es mir bitte einfach.

Das Linux-Dienstprogramm, um die Ausführung eines Prozesses auf einen vordefinierten Kern zu beschränken, ist taskset. Sie sollten es standardmäßig haben, wenn nicht, überprüfen Sie das Paket util-linux. Sie können den Prozess anzeigenAffinität(dh, die Liste der CPUs, auf denen es laufen darf) mittels

      taskset -cp Process_ID

(Das pFlag gibt an, dass eine Prozessnummer folgt. Das cFlag ersetzt die hexadezimale Darstellung der CPU-Kerne durch eine Zeichenfolge, was der Standard wäre.)

Sie können einen bereits laufenden Prozess so einrichten, dass er nur auf den Kernen 0 und 1 ausgeführt wird, beispielsweise durch

     taskset -cp 0,1 Process_ID

oder starten Sie ein neues Programm nur auf Kern 0 mittels:

      taskset -c 0 VBoxManage startvm Name_of_VM --type headless

Zwei Vorbehalte: Erstens bedeutet die Tatsache, dass Sie den Prozess auf eine einzige CPU beschränkt haben, nicht, dass dies der einzige Prozess sein wird, der auf dieser läuft: Alle Prozesse, deren Affinität diese CPU umfasst, werden für einen gewissen Teil der Zeit auf ihr laufen. Wenn Sie eine bestimmte CPU für die ausschließliche Verwendung eines Prozesses reservieren möchten, den Sie mit festgelegt haben taskset, müssen Sie den Parameter verwenden, isolcpusderisoliert die angegebene CPU vom Kernel-Scheduler. Fügen Sie einfach den Parameter isolcpus=[cpu_number] zur Linux-Kernel-Befehlszeile für den Bootloader hinzu.

Außerdem sollten Sie wissen, dass die Beschränkung eines Prozesses auf eine einzige CPU nicht unbedingt das ist, total solutionwas Sie zu glauben scheinen. CPUs verwenden Peripheriegeräte aller Art und können unter bestimmten Umständen hängen bleiben, weil das betreffende Peripheriegerät nicht mehr verfügbar ist, was dazu führt, dass die CPU ihre Anfragen in einer Schleife abwickelt und der Bus und möglicherweise auch das Peripheriegerät mit den Anfragen überlastet werden. Ein Beispiel? Ich verwende den Sonos-Controller unter Wine. Wenn ich ein VPN aktiviere, wird die Verbindung zu seiner Heimatbasis in Kalifornien getrennt und mein System wird weiterhin mit Netzwerkanfragen überflutet. Dies hat nichts mit der Beschränkung auf eine einzige CPU zu tun.

Antwort2

Mithilfe der Antwort von MariusMatutiae gelang es mir schließlich, das „Spreader“-Skript zu schreiben, das alle gestarteten Virtualbox-VMs auf verschiedene Kerne verteilt. Darüber hinaus macht es dasselbe auch mit VMware-VMs.

Um dieses Skript zu verwenden, sollten alle Ihre VMs Single-Core-VMs sein (das lässt sich in den Einstellungen festlegen). Andernfalls können Sie sie ausschließen, indem Sie den regulären Ausdruck von grep ändern.

#!/bin/bash

#getting possible affinity lists
AFFINITY=($(taskset -cp 1 | sed 's/.*\([0-9]\)\+[-]\([0-9]\+\).*/\1 \2/'))

echo Detected min_cpu: ${AFFINITY[0]}, max_cpu: ${AFFINITY[1]}.

CURRENT_AFFINITY=${AFFINITY[1]};

ps -Af | grep -i "[V]irtualBox.*comment\|.*[.]vm[x]" | awk -F" " '{ print $2}' |

# Iterating backwards because I think that farther cpus are less loaded. Maybe I am wrong
while read pid
do
    echo Setting $pid to cpu $CURRENT_AFFINITY
    taskset -cp $CURRENT_AFFINITY $pid


    #loop stuff
    let CURRENT_AFFINITY=CURRENT_AFFINITY-1;
    if [[ "$CURRENT_AFFINITY" -lt ${AFFINITY[0]} ]];
    then
        CURRENT_AFFINITY=${AFFINITY[1]};
    fi
done

Wenn Sie möchten, dass es nur mit VirtualBox-VMs funktioniert, entfernen Sie es [V]irtualBox.*comment\|aus dem Grep-Muster. Wenn Sie möchten, dass es nur mit VMware-VMs funktioniert, entfernen Sie es \|.*[.]vm[x]aus dem Grep-Muster.

Direkt nach dem Anwenden dieses Skripts können Sie einige Sekunden lang Verzögerungen in allen VMs feststellen. Dann wird alles gut und funktioniert wie erwartet.

Jetzt können VMs meine CPU nicht mehr fressen, selbst wenn sie überlastet sind, und Firefox frisst sie wirklich gerne komplett. Aber das ist eine andere Geschichte... :/

verwandte Informationen