VMware und Athlon Dual Core Prozessor – Tipp 2

VMware und Athlon Dual Core Prozessoren - Teil 2: CPU-Frequenz unter Linux explizit setzen

Einführung
Im letzten Beitrag
"VMware und Athlon Dual Core Prozessoren - Teil 1"
hatte ich dargestellt, dass auf Doppelcore-Prozessoren einer virtuellen Maschine möglichst nur ein Prozessor-Core zugeordnet werden sollte. Für ein optimales Setup ist dies allerdings noch nicht ausreichend.

So musste ich auf meiner Maschine (Athlon X2 4800, Host Opensuse 10.2, Gast Win XP) leider erleben, dass die Bestimmung der CPU-Frequenz, die VMware beim Starten der virtuellen Maschine vornimmt, keine konstanten Ergebnisse lieferte. Dies galt und gilt auch dann, wenn der virtuellen Maschine nur ein (virtueller) Prozessor zugewiesen wurde. Auch das im VMware Workstation Forum beschworene Abschalten von CPU Throttling und Energiesparoptionen auf Linux-Ebene (Stichwort KPowersave unter KDE) wie auch auf BIOS-Ebene änderten daran leider nichts.

Die im Gastsystem gemeldeten Frequenzwerte der CPU wichen z.T. erheblich von der realen Frequenz der CPU-Cores ab. Ist die Abweichung nach oben (zu hoch geschätzte Freq.) zu groß, kommt es in der Regel zu einem instabilen Verhalten der virtuellen Maschine. Äußere Anzeichen sind etwa ein ruckeliger Cursor, zu schnelle oder ruckartige Buchstabengenerierung etc..

Als Beispiel eine Messreihe, die ich auf meinem Athlon X2 4800 System erhalten habe (Hostsystem Opensuse 10.2, Gastsystem Win XP, VMware WS 6.0):

host: 2.4 GHz -> guest: 2.41 GHz
host: 2.4 GHz -> guest: 2.41 GHz
host: 2.4 GHz -> guest: 2.75 GHz
host: 2.4 GHz -> guest: 2.75 GHz
host: 2.4 GHz -> guest: 3.05 GHz
host: 2.4 GHz -> guest: 2.44 GHz
host: 2.4 GHz -> guest: 2.41 GHz
host: 2.4 GHz -> guest: 3.05 GHz
host: 2.4 GHz -> guest: 2.75 GHz
host: 2.4 GHz -> guest: 2.41 GHz
host: 2.4 GHz -> guest: 2.41 GHz

Genauere Werte mit mehreren Nachkomma-Stellen entnimmt man übrigens dem VMware-Logfile (Dieses findet man für jede virtuelle Maschine in dem Verzeichnis , in dem man die Maschine (besser ihr *.vmx - Konfigurationsfile) angelegt hat. Im aktuellen Log-File suche man nach Einträgen der Art

Aug 15 10:23:20.346: vmx| VMMon_GetkHzEstimate: Calculated 2753892 kHz

bzw. in der guest section des Log-Files
-------------------------------
Aug 15 10:23:20.850: vmx| KHZEstimate 2753892
Aug 15 10:23:20.850: vmx| MHZEstimate 2754
Aug 15 10:23:20.850: vmx| NumVCPUs 1
Aug 15 10:23:20.850: vmx| KHZEstimate 2753892
Aug 15 10:23:20.850: vmx| MHZEstimate 2754
Aug 15 10:23:20.850: vmx| NumVCPUs 1

Potentielle Fehlerursache
Leider habe ich von VMware keinen konkreten Hinweis darauf erhalten, warum die Frequenzbestimmung nicht zu konstanten Werten führt. Ich vermute aber, dass auch dieses Problem speziell bei Prozessoren auftritt, deren Cores nicht von einer zentralen Einheit aus getaktet werden. Wenn während der Frequenzbestimmung das Hostsystem die VMware-Tasks einem anderen Core zuweist und die Frequenzbestimmung Taktzyklen abfragt, dann kann es in einem solchen Fall natürlich zu fehlerhaften Werten kommen. Aber das ist wie gesagt ein wenig Spekulation ....

Eingrenzung der realen CPU-Frequenz unter Linux
Es wäre zu einfach von einer idealen Frequenz auszugehen. Bei einem Athlon X2 4800 wären dies 2400.000 MHz. In der Realität weicht die tatsächliche Frequenz jedoch immer ein wenig von der idealen Frequenz der Baureihe ab. Folgende Schritte führen zu einer genaueren Frequenzbestimmung mit Hilfe des VMware Log-Files):
1. Mehrere Starts der virtuellen Maschine und Auswahl des Frequenzwertes, der der idealen Frequenz am nächsten kommt und i.d.R. am häufigsten in einer Messreihe auftritt.
2. Bindung der VMware-Prozesse an einen CPU Core vor der Frequenzmessung
Hierzu verwendet man das Kommando "taskset". Also z.B. "taskset -c 0 vmware". Danach überprüft man die CPU Affinität des gestarteten Prozesses mit "taskset -p pid" (pid ist die Process ID des gestarteten vmware-Prozesses. Bzgl. der Bitmatrix für die CPUs siehe die "manpage" zu "taskset").

Danach starte man die virtuelle Maschine. In der Prozessübersicht findet man dann weitere VMware Prozesse - u.a. den Prozess "vmware-vmx". Auch hier überprüfe man die CPU Affinität. Der Prozess sollte dem gleichen CPU-Core zugeordnet sein wie der primäre "vmware"-Prozess. Die dann in der virtuellen Maschine ausgegebenen, geschätzten CPU-Frequenzen (siehe das VMware Log-File!) stimmten bei mir mit dem Wert überein, den die Auswertung einer Meßreihe wie unter 1) beschrieben ergeben hatte.

An dieser Stelle könnte man zu Recht fragen, warum man nicht einfach den Frequenzwert nimmt, den das Linux-System unter /proc/cpuinfo anbietet. (In meinem Fall tauchen da exakt 2400.000 Mhz auf.) Hierauf habe ich nur die Antwort, dass nach meiner Erfahrung die Abweichungen der Uhrzeiten im virtuellen System von der realen Host-Zeit geringer bleiben, wenn man den Frequenz-Wert verwendet, der nach den oben beschrieben Methoden ermittelt wird. (Dies unter der Voraussetzung, dass man in den VMware-Tools die Synchronization der Host und Guest-Zeit nichtaktiviert hat.)

Dauerhaftes Festlegen der CPU-Frequenz für die virtuelle Maschine
Um die CPU-Frequenz als dauerhafte Vorgabe für virtuelle Maschinen festzulegen, muß man das zentrale Konfigurationsfile für VMware bearbeiten. Unter Linux findet man dieses File bei einer Standardinstallation unter /etc/vmware/config. Dieses File ergänzt man um Einträge folgender Art:

host.cpukHz = 2412359
host.noTSC = TRUE
ptsc.noTSC = TRUE

Der angegebene cpukHz-Wert muss natürlich durch den ersetzt werden, den wir durch die obigen Schritte ermittelt haben.
Der erste Eintrag legt die (maximale) CPU Taktfrequenz fest. Die nächsten Zeilen bewirken, dass die Uhrzeit trotz evtl. variierendem Time Stamp Counter (TSC) den richtigen Wert behält. Dies ist wichtig, wenn man Stromspareigenschaften des Systems aktiviert, die zu einem CPU Throttling führen.

Hinweis 1: Ich empfehle, trotz der noTSC-Optionen im config-File Stromsparfunktionen während der Laufzeit von VMware über geeignete Tools des Hostsystems abzuschalten. Wirklich negative Erfahrungen habe ich zwar auch bei aktiviertem CPU-Powersave uind entspr. Frequenzthrottling nicht gesammelt, aber hier folge ich dem Ratschlag der VMware Gurus.

Hinweis 2: In der so konfigurierten Maschine ist eine fixe Zuordnung der VMware-Prozesse zu genau einer CPU (bzw. CPU-Core) nicht erforderlich.

Meine Erfahrungen zur Lastverteilung mit der Workstation 6 unter Opensuse 10.2 ist nach der Vorgabe einer virtuellen CPU und der Vorgabe einer exakten CPU-Frequenz außerordentlich positiv. Auch komplexe Aufgaben unter WIN XP (Adobe Flash, Photoshop, Dreamweaver, .... ) sind auf einem AMD X2 4800 Prozessor problemlos unter VMware mit einer (virtuellen) CPU ausführbar. Beobachtet man das System genau, so gewinnt man den Eindruck, dass VMware Overhead (z.B. Vorbereiten von Extends der virtuellen Platte und zugehörige Dateioperationen im Linux-File-System; Netzwerkoperationen) bei Bedarf trotzdem durch den zweiten Prozessor-Core erledigt wird.

Für meine Diskussion mit VMware siehe:
http://communities.vmware.com/message/724123#724123