Sergey Nivens - Fotolia
Hyper-Threading und Overcommitment beim vCPU-Provisioning
Hyper-Threading, Overcommitment und Skalierung: Bei der vCPU-Zuweisung an virtuelle Maschinen gibt es einige Dinge zu beachten. Diese Tipps helfen beim vCPU-Provisioning.
Die Virtualisierung hat die Nutzung von Computer-Ressourcen wie CPU, Hauptspeicher, Massenspeicher und Netzwerk in erheblicher Weise verbessert. Die Annehmlichkeit und Flexibilität der Virtualisierung kann aber auch enorme Ressourcenverschwendung mit sich bringen. Eine virtuelle Maschine kann erhebliche Ressourcen verbrauchen, obwohl eine übertriebene Zuweisung noch nicht einmal zwingend die Leistung verbessert. So erhöhen Sie nur die Ressourcenverschwendung und die Kosten für Ihr Unternehmen.
Egal, ob Sie Ihre ersten Schritte in der Virtualisierung unternehmen oder Ihre Kenntnisse noch einmal auffrischen wollen: Es ist immer eine gute Idee, die Art und Weise Ihrer Ressourcen-Deployments im Rechenzentrum noch einmal unter die Lupe zu nehmen. Den Anfang machen Sie dabei am besten gleich mit den virtuellen CPUs (vCPU).
Ein Hypervisor abstrahiert die darunter liegenden physischen CPU-Kerne eines Servers und stellt sie als vCPUs dar. Verstehen sich die Kerne auf Hyper-Threading, so wird jeder Thread als eigene vCPU dargeboten. Ein Achtkernprozessor zum Beispiel würde acht vCPUs aufweisen, während es ein Achtkernprozessor mit Hyper-Threading auf 16 Stück bringen würde. Die Zuweisung von vCPUs an VMs übernimmt ein Administrator.
Die heute üblichen Server nutzen Prozessoren mit leistungsstarken Technologien für die Virtualisierung von CPU-Ressourcen, etwa Intel VT-x oder AMD-V. MMU-Virtualisierung (Memory Management Unit) erhalten Sie über Intel Extended Page Tables und AMD Rapid Virtualization Indexing. Für I/O MMU stehen Intel VT-d und AMD-Vi zur Verfügung. Das bedeutet, dass die zugrundeliegenden Prozessoren in aller Regel höchste Leistung für den Hypervisor und seine VMs bereitstellen können.
Dabei gibt es praktisch keinen Overhead, der durch die Implementierung und Vorhaltung der Virtualisierung moderner Prozessoren einhergeht. Die eigentliche Herausforderung liegt darin, einer VM die richtigen vCPU-Ressourcen zuzuweisen.
Vorsicht bei vCPU-Overcommitment
Beim Thema vCPU-Provisionierung ist weniger meist mehr. Natürlich können Sie einer VM durch Overcommitment mehr vCPUs zuweisen, als diese tatsächlich benötigt. Aber ein Workload nimmt immer nur die Prozessorzeit in Anspruch, die er tatsächlich benötigt. Deshalb garantieren Ihnen das vCPU-Overcommitment keineswegs eine höhere Workload-Leistung. Da eine vCPU, die einer VM zugewiesen ist, nicht für andere VMs tätig werden kann, sind die überschüssig zugewiesenen vCPUs aber faktisch reine Ressourcenverschwendung. Genau das Gegenteil des durch die Virtualisierung gewünschten Effekts also.
Der beste Ansatz, dies zu verhindern, ist die Überwachung der CPU-Nutzung der einzelnen VM und derjenigen des physischen Host-Servers. Tools wie VMwares esxtop oder resxtop unterstützen Administratoren bei der Messung der Prozessorlast. Grundsätzlich sollten Sie eine Auslastung von 80 Prozent als maximale Obergrenze betrachten. Ab einer Auslastung von 90 Prozent sollten Sie überlegen, zusätzliche Prozessoren zuzuweisen oder Workloads auf andere Server zu verteilen. Bei einer Auslastung von mehr als 90 Prozent sind die CPU-Ressourcen definitiv überlastet und die Workloads auf diesem Prozessor werden in der Regel mit Leistungseinbußen zu kämpfen haben – insbesondere bei latenzkritischen Anwendungen.
vCPU-Ressourcen und Hyper-Threading
Hyperthreading ist eine wichtige Technologie, die es einem CPU-Kern ermöglicht, zwei statt nur eine Instruktions-Pipeline abzuarbeiten. In einigen Rechnerumgebungen ist das ein wertvolles Werkzeug, erlaubt es doch manchen Aufgaben, mehr Prozessorzeit in Anspruch zu nehmen.
Das Problem beim Hyper-Threading ist allerdings, dass dabei natürlich nicht die volle Leistung zur Verfügung steht. Auch wenn ein Hypervisor eine CPU mit Hyper-Threading als zwei vCPUs erkennt, erhält nur eine davon die volle Leistung. Da Hyper-Threading entscheidende Bestandteile der Instruktions-Pipeline der CPU auf die beiden Hyper-Threading-CPUs aufteilt, werden Workloads auf den zwei logischen CPUs der einen physischen CPU meist mit geringerer Leistung ausgeführt.
Auch wenn Hypervisoren wie VMware ESXi die Nutzung von Hyper-Threading nahelegen, so liefert doch ein Server mit Hyper-Threading-CPU nicht wirklich doppelt so viele ebenso leistungsstarke vCPUs. Es könnte also durchaus sein, dass ein Server mit doppelt so vielen Kernen ohne Hyper-Threading sinnvoller ist, oder sogar das Abschalten von Hyper-Threadings im BIOS Leistungszuwächse bewirkt. Ein Server mit 16 Single-Threaded-vCPUs zum Beispiel kann eine bessere Gesamtleistung bieten als ein Server mit acht Hyper-Threaded-CPUs, die auf 16 vCPUs virtualisiert werden.
Ist Hyper-Threading aktiviert, wie es Anbieter von Hypervisoren in der Regel empfehlen, so sollten Sie unbedingt darauf achten, auf welche Weise Sie die vCPUs den VMs zuweisen. Zwei Workloads mit jeweils hohen Anforderungen an die Rechenleistung sollten nicht auf zwei Hyper-Threading-vCPUs desselben physischen CPU-Kerns laufen, sondern vCPUs unterschiedlicher physischer Prozessorkerne erhalten. Andernfalls kann es schnell zu Performance-Problemen kommen, wenn eine physische CPU mit zwei Hyper-Threading-vCPUs zwei rechenintensive Workloads gleichzeitig abarbeiten muss.
Strategische Nutzung von CPU-Affinität
CPU-Affinität – und Anti-Affinität – in einem Hypervisor kann die Platzierung und CPU-Zugriffe von VMs beeinflussen. CPU-Affinität ermöglicht es Administratoren, einen oder mehrere Kerne einer bestimmten VM zuzuordnen. Anti-Affinität sorgt hingegen dafür, dass eine VM bestimmte CPU-Kerne ganz sicher nicht nutzen wird (und damit die zugehörigen vCPUs). Affinitätsregeln können für anspruchsvolle Workloads wichtig sein, bei denen Administratoren eine Mindestverfügbarkeit von Prozessoren für einen Workload garantieren wollen.
Affinitätsregeln können allerdings auf Systemen mit Hyper-Threading zu Problemen führen. Wird Affinität genutzt, um vCPUs demselben physischen Prozessor zuzuweisen, so kann dies zu einer unzureichenden VM-Leistung führen. Hier kommen wieder die eben genannten Probleme mit Hyper-Threading ins Spiel: Werden den beiden vCPUs eines Hyper-Threading-Prozessors über Affinitätsregeln zwei rechenintensive Workloads zugewiesen, dann wird dies ziemlich sicher die Performance beeinträchtigen. Besser wäre es also, per Affinitätsregel dafür zu sorgen, dass beide Workloads vCPUs unterschiedlicher CPU-Kerne erhalten oder aber über Anti-Affinität die Nutzung des gleichen CPU-Kerns zu unterbinden.
Horizontale statt vertikale Skalierung
Grundsätzlich betrachtet führt eine größere Menge kleinerer VMs (horizontale Skalierung) zu besseren Leistungsergebnissen als eine kleinere Menge großer – entsprechend ressourcenhungriger – VMs (vertikale Skalierung). Die horizontale Skalierung in die Breite ist der vertikalen in die Höhe also vorzuziehen.
Als Administrator sollten Sie immer auch im Blick haben, ob Sie Workloads nicht lieber als VM-Cluster mit Load-Balancing implementieren, statt eine große VM für dieselbe Aufgabe vorzusehen. Dieser Ansatz ermöglicht Ihnen auch die Verbesserung der Workload-Performance, wenn nur minimale virtuelle Maschinen dem Cluster hinzugefügt werden müssen und zusätzlich können Sie so auch eine gewisse Elastizität der Workloads aufbauen.
Es gibt aber auch Fälle, in denen das Gegenteil zutrifft und weniger, dafür aber größere VMs sinnvoller sind. Das kann sich manchmal schon an Fragen wie der Speichernutzung und Cache-Auslastung entscheiden. Administratoren müssen diese Art von Skalierungsentscheidungen durch Tests und Steigerung der Anwendungsleistung treffen, um so die ideale Deployment-Entscheidung treffen zu können.
Folgen Sie SearchDataCenter.de auch auf Twitter, Google+, Xing und Facebook!