Warum sollte Linux VM in vSphere ESXi 5.5 eine dramatisch erhöhte Latenzzeit für Festplatten-E / A aufweisen?

8

Ich bin ratlos und hoffe, dass jemand anderes die Symptome dieses Problems erkennt.

Hardware: neuer Dell T110 II, Dual-Core-Pentium G850 mit 2,9 GHz, integrierter SATA-Controller, eine neue kabelgebundene Festplatte mit 500 GB und 7200 U / min in der Box, andere Laufwerke im Inneren, aber noch nicht montiert. Kein RAID. Software: Neue virtuelle CentOS 6.5-Maschine unter VMware ESXi 5.5.0 (Build 1746018) + vSphere Client. 2,5 GB RAM zugewiesen. Auf der Festplatte hat CentOS angeboten, sie einzurichten, und zwar als Volume innerhalb einer LVM-Volume-Gruppe, mit der Ausnahme, dass ich auf ein separates / home verzichtet habe und einfach / und / boot habe. CentOS ist gepatcht, ESXi gepatcht, die neuesten VMware-Tools sind auf der VM installiert. Keine Benutzer im System, keine laufenden Dienste, keine Dateien auf der Festplatte, sondern die Installation des Betriebssystems. Ich interagiere mit der VM über die virtuelle VM-Konsole in vSphere Client.

Bevor ich fortfuhr, wollte ich überprüfen, ob ich die Dinge mehr oder weniger vernünftig konfiguriert habe. Ich habe den folgenden Befehl als root in einer Shell auf der VM ausgeführt:

for i in 1 2 3 4 5 6 7 8 9 10; do
  dd if=/dev/zero of=/test.img bs=8k count=256k conv=fdatasync
done

Dh, wiederholen Sie einfach den Befehl dd 10 Mal, was dazu führt, dass die Übertragungsrate jedes Mal gedruckt wird. Die Ergebnisse sind beunruhigend. Es fängt gut an:

262144+0 records in
262144+0 records out
2147483648 bytes (2.1 GB) copied, 20.451 s, 105 MB/s
262144+0 records in
262144+0 records out
2147483648 bytes (2.1 GB) copied, 20.4202 s, 105 MB/s
...

aber nach 7-8 davon wird es dann gedruckt

262144+0 records in
262144+0 records out
2147483648 bytes (2.1 GG) copied, 82.9779 s, 25.9 MB/s
262144+0 records in
262144+0 records out
2147483648 bytes (2.1 GB) copied, 84.0396 s, 25.6 MB/s
262144+0 records in
262144+0 records out
2147483648 bytes (2.1 GB) copied, 103.42 s, 20.8 MB/s

Wenn ich längere Zeit warte, z. B. 30-45 Minuten, und es erneut ausführe, geht es wieder auf 105 MB / s zurück und nach mehreren Runden (manchmal ein paar, manchmal 10+) sinkt es auf ~ 20- Wieder 25 MB / s.

Aufgrund der vorläufigen Suche nach möglichen Ursachen, insbesondere VMware KB 2011861 , habe ich den Linux- E / A-Scheduler auf " noop" anstatt auf "Standard " geändert . cat /sys/block/sda/queue/schedulerzeigt, dass es in Kraft ist. Ich kann jedoch nicht sehen, dass es einen Unterschied in diesem Verhalten gemacht hat.

Wenn Sie die Festplattenlatenz in der vSphere-Benutzeroberfläche darstellen, werden Zeiträume mit hoher Festplattenlatenz angezeigt, die während der Zeiten, in denen der niedrige Durchsatz gemeldet wird, 1,2 bis 1,5 Sekunden betragen dd. (Und ja, die Dinge reagieren ziemlich unempfindlich, während das passiert.)

Was könnte das verursachen?

Ich bin mir sicher, dass dies nicht auf einen Ausfall der Festplatte zurückzuführen ist, da ich auch zwei andere Festplatten als zusätzliches Volume im selben System konfiguriert habe. Zuerst dachte ich, ich hätte etwas mit diesem Volume falsch gemacht, aber nachdem ich das Volume aus / etc / fstab auskommentiert und neu gestartet und die Tests auf / wie oben gezeigt ausprobiert hatte, wurde klar, dass das Problem anderswo liegt. Es ist wahrscheinlich ein ESXi-Konfigurationsproblem, aber ich bin nicht sehr erfahren mit ESXi. Es ist wahrscheinlich etwas Dummes, aber nachdem ich versucht habe, dies über mehrere Tage hinweg viele Stunden lang herauszufinden, kann ich das Problem nicht finden, also hoffe ich, dass mich jemand in die richtige Richtung weisen kann.

(PS: Ja, ich weiß, dass diese Hardware-Kombination als Server keine Geschwindigkeitsprämien gewinnt, und ich habe Gründe, diese Low-End-Hardware zu verwenden und eine einzelne VM auszuführen, aber ich denke, das ist nicht der Punkt für diese Frage [es sei denn es ist eigentlich ein Hardwareproblem].)

ADDENDUM 1 : Beim Lesen anderer Antworten wie dieser habe ich versucht, sie oflag=directzu ergänzendd . Es macht jedoch keinen Unterschied im Ergebnismuster: Anfangs sind die Zahlen für viele Runden höher, dann fallen sie auf 20-25 MB / s. (Die anfänglichen absoluten Zahlen liegen im Bereich von 50 MB / s.)

ADDENDUM 2 : Das Hinzufügen sync ; echo 3 > /proc/sys/vm/drop_cacheszur Schleife macht überhaupt keinen Unterschied.

ADDENDUM 3 : Um weitere Variablen herauszunehmen, führe ich sie jetzt ddso aus, dass die von ihr erstellte Datei größer ist als der RAM-Speicher auf dem System. Der neue Befehl lautet dd if=/dev/zero of=/test.img bs=16k count=256k conv=fdatasync oflag=direct. Die anfänglichen Durchsatzzahlen bei dieser Version des Befehls betragen ~ 50 MB / s. Sie fallen auf 20-25 MB / s, wenn die Dinge nach Süden gehen.

ADDENDUM # 4 : Hier ist die Ausgabe der iostat -d -m -x 1Ausführung in einem anderen Terminalfenster, während die Leistung "gut" ist, und dann wieder, wenn sie "schlecht" ist. (Während das läuft, renne ich dd if=/dev/zero of=/test.img bs=16k count=256k conv=fdatasync oflag=direct.) Erstens, wenn die Dinge "gut" sind, zeigt es Folgendes:

Geben Sie hier die Bildbeschreibung ein

Wenn die Dinge "schlecht" laufen, iostat -d -m -x 1zeigt dies:

Geben Sie hier die Bildbeschreibung ein

ADDENDUM # 5 : Auf Vorschlag von @ewwhite habe ich versucht, tunedmit verschiedenen Profilen zu arbeiten und habe es auch versucht iozone. In diesem Anhang berichte ich über die Ergebnisse von Experimenten, bei denen untersucht wurde, ob unterschiedliche tunedProfile Auswirkungen auf das ddoben beschriebene Verhalten hatten. Ich habe versucht , das Profil zu ändern zu virtual-guest, latency-performanceund throughput-performance, halten alles andere gleich, nach jeder Änderung neu zu starten, und dann jedes Mal ausgeführt wird dd if=/dev/zero of=/test.img bs=16k count=256k conv=fdatasync oflag=direct. Es hatte keinen Einfluss auf das Verhalten: Nach wie vor laufen die Dinge gut an und viele wiederholte Läufe ddzeigen die gleiche Leistung, aber irgendwann nach 10-40 Läufen sinkt die Leistung um die Hälfte. Als nächstes habe ich verwendet iozone. Diese Ergebnisse sind umfangreicher, daher füge ich sie als Anhang Nr. 6 unten ein.

ADDENDUM 6 : Auf Vorschlag von @ewwhite habe ich die Leistung installiert und iozonezum Testen verwendet. Ich habe es unter verschiedenen tunedProfilen ausgeführt und einen sehr großen Parameter für die maximale Dateigröße (4G) verwendet iozone. (Der VM sind 2,5 GB RAM zugewiesen, und dem Host sind insgesamt 4 GB zugeordnet.) Diese Testläufe dauerten einige Zeit. FWIW, die Rohdatendateien sind unter den folgenden Links verfügbar. In allen Fällen lautete der Befehl zum Erstellen der Dateien iozone -g 4G -Rab filename.

Das Folgende ist meine Zusammenfassung.

In einigen Fällen habe ich nach einem vorherigen Lauf neu gestartet, in anderen Fällen nicht und einfach iozoneerneut ausgeführt, nachdem ich das Profil mit geändert habe tuned. Dies schien keinen offensichtlichen Unterschied zu den Gesamtergebnissen zu machen.

Unterschiedliche tunedProfile schienen sich nicht (zu meinem zugegebenermaßen unerfahrenen Augen) , um die beeinflussen breite Verhalten berichtet iozone, obwohl die Profile bestimmte Details beeinträchtigen. Erstens, nicht überraschend, haben einige Profile den Schwellenwert geändert, bei dem die Leistung beim Schreiben sehr großer Dateien abfiel: Wenn Sie die iozoneErgebnisse zeichnen , sehen Sie eine steile Klippe bei 0,5 GB für das Profil, latency-performanceaber dieser Abfall manifestiert sich bei 1 GB unter dem Profilenterprise-storage. Zweitens, obwohl alle Profile eine seltsame Variabilität für Kombinationen aus kleinen Dateigrößen und kleinen Datensatzgrößen aufweisen, unterschied sich das genaue Variabilitätsmuster zwischen den Profilen. Mit anderen Worten, in den unten gezeigten Darstellungen existiert das schroffe Muster auf der linken Seite für alle Profile, aber die Positionen der Gruben und ihre Tiefen sind in den verschiedenen Profilen unterschiedlich. (Ich habe jedoch nicht Läufe mit denselben Profilen wiederholt, um festzustellen, ob sich das Variabilitätsmuster zwischen Läufen mit iozonedemselben Profil merklich ändert. Daher ist es möglich, dass Unterschiede zwischen Profilen nur zufällige Variabilität sind.)

Das Folgende sind Oberflächendiagramme der verschiedenen iozoneTests für das tunedProfil von latency-performance. Die Beschreibungen der Tests werden aus der Dokumentation für kopiert iozone.

Lesetest : Dieser Test misst die Leistung beim Lesen einer vorhandenen Datei.

Geben Sie hier die Bildbeschreibung ein

Schreibtest: Dieser Test misst die Leistung beim Schreiben einer neuen Datei.

Geben Sie hier die Bildbeschreibung ein

Zufälliges Lesen: Dieser Test misst die Leistung beim Lesen einer Datei, wobei auf zufällige Speicherorte in der Datei zugegriffen wird.

Geben Sie hier die Bildbeschreibung ein

Zufälliges Schreiben: Dieser Test misst die Leistung beim Schreiben einer Datei, wobei auf zufällige Speicherorte in der Datei zugegriffen wird.

Geben Sie hier die Bildbeschreibung ein

Fread: Dieser Test misst die Leistung beim Lesen einer Datei mit der Bibliotheksfunktion fread (). Dies ist eine Bibliotheksroutine, die gepufferte und blockierte Lesevorgänge ausführt. Der Puffer befindet sich im Adressraum des Benutzers. Wenn eine Anwendung sehr kleine Übertragungen einliest, kann die gepufferte und blockierte E / A-Funktionalität von fread () die Leistung der Anwendung verbessern, indem die Anzahl der tatsächlichen Betriebssystemaufrufe verringert und die Größe der Übertragungen beim Betriebssystem erhöht wird Anrufe werden getätigt.

Geben Sie hier die Bildbeschreibung ein

Fwrite: Dieser Test misst die Leistung beim Schreiben einer Datei mit der Bibliotheksfunktion fwrite (). Dies ist eine Bibliotheksroutine, die gepufferte Schreibvorgänge ausführt. Der Puffer befindet sich im Adressraum des Benutzers. Wenn eine Anwendung in sehr kleinen Übertragungen schreibt, kann die gepufferte und blockierte E / A-Funktionalität von fwrite () die Leistung der Anwendung verbessern, indem die Anzahl der tatsächlichen Betriebssystemaufrufe verringert und die Größe der Übertragungen unter Betriebssystem erhöht wird Anrufe werden getätigt. Bei diesem Test wird eine neue Datei geschrieben, sodass der Overhead der Metadaten erneut in die Messung einbezogen wird.

Geben Sie hier die Bildbeschreibung ein

Während dieser Zeit iozonehabe ich schließlich auch die Leistungsdiagramme für die VM in der Client-Oberfläche von vSphere 5 untersucht. Ich wechselte zwischen den Echtzeitdiagrammen der virtuellen Festplatte und dem Datenspeicher hin und her. Die verfügbaren Plotparameter für den Datenspeicher waren größer als für die virtuelle Festplatte, und die Leistungsdiagramme für den Datenspeicher schienen die Funktionsweise der Diagramme für Festplatte und virtuelle Festplatte widerzuspiegeln. Daher füge ich hier nur eine Momentaufnahme des Datenspeicherdiagramms bei, das nach iozoneAbschluss (unter tunedProfil) erstellt wurde latency-performance). Die Farben sind etwas schwer zu lesen, aber was vielleicht am bemerkenswertesten ist, sind die scharfen vertikalen Spitzen beim LesenLatenz (z. B. um 4:25 Uhr, dann wieder kurz nach 4:30 Uhr und erneut zwischen 4: 50-4: 55 Uhr). Hinweis: Der Plot ist nicht lesbar, wenn er hier eingebettet ist. Daher habe ich ihn auch auf http://cl.ly/image/0w2m1z2T1z2b hochgeladen

vSphere-Echtzeitdiagramm der VM

Ich muss zugeben, ich weiß nicht, was ich davon halten soll. Ich verstehe besonders die seltsamen Schlaglochprofile in den Bereichen mit kleinen Datensätzen und kleinen Dateigrößen der iozoneDiagramme nicht.

mhucka
quelle
Angenommen, Sie haben über einen langen Zeitraum eine hohe Festplattenauslastung in Bezug auf IOPS verwendet, dann tritt wahrscheinlich eine gewisse Festplattensättigung auf (entweder auf der Ebene der OS-Schreibwarteschlange oder eher auf der Festplattenebene), auf der Sie sich befinden Sie haben mehr Anfragen, als Ihre Festplatte derzeit verarbeiten kann. Ich habe nicht genug Erfahrung, um Ihnen zu sagen, wie Sie feststellen können, ob bei Ihnen eine Festplattensättigung auftritt, aber ich denke, dies könnte ein Untersuchungspunkt für Sie sein.
Jason Zhu
@ JasonZhu Es ist eine gute Frage. Ich habe angenommen, dass der Grad der Festplattennutzung ungefähr konstant ist, da das System nichts anderes tut und ich lediglich wiederholt denselben Befehl ausführe. Trotzdem dauert es lange, bis sich das Verhalten trotzdem manifestiert. Ich bin gelaufen iostatund es zeigte eine Auslastung von ~ 90% sowohl vorher als auch nachher. Aber ich bin kein Experte für die Beurteilung dieser Dinge - vielleicht passiert irgendwo eine Sättigung. Ich aktualisiere meine Frage, um die iostatAusgabe anzuzeigen, falls sie nützlich ist.
Mhucka
Gibt es eine Möglichkeit, dass dies auf das Zwischenspeichern von ESX-Datenträgern zurückzuführen ist? Ist die Festplatte, die Sie testen, auf Leistung oder Sicherheit optimiert? Können Sie die ESX-Cache-Auslastung beim Testen überprüfen, wenn die Leistung optimiert ist? Diese Änderung des Durchsatzes bei Schreib-E / A-Vorgängen sieht so aus, als würden Schreibvorgänge in einen Cache gelangen und sich beim Auffüllen auf die Zielgeschwindigkeit verlangsamen.
Basil
Könnte das etwas mit Ihrem RAID-Controller-Cache zu tun haben? Hoher IOPS / Durchsatz, bis er voll ist und Sie dann auf die rohe Festplattenleistung zurückgreifen? Nur raten ...
Mario Lenz
@MarioLenz Wie ich in der Beschreibung erwähnt habe, hat dies kein RAID.
Mhucka

Antworten:

2

Können Sie die genaue ESXi-Build-Nummer angeben? Versuchen Sie es erneut mit einem speziell entwickelten Tool zur Analyse der Festplattenleistung wie fio oder iozone , um eine echte Basis zu erhalten. Die Verwendung ddist dafür nicht wirklich produktiv.

Im Allgemeinen ist der Standard-E / A-Scheduler in EL6 nicht so gut. Sie sollten versuchen, auf die Deadline- oder Noop-E / A-Aufzüge umzusteigen oder noch besser das abgestimmte Framework zu installieren .

Versuchen Sie: yum install tuned tuned-utilsund tuned-adm profile virtual-guestdann erneut zu testen.

ewwhite
quelle
Argh, ich habe es versäumt zu erwähnen, dass ich den Scheduler tatsächlich auf noop geändert habe. Ich werde meine Frage bearbeiten, um das zu sagen. Die Build-Nummer ist 1746018. (Ich habe das in den zweiten Absatz aufgenommen, aber ich sehe, dass etwas passiert ist und es abgeschnitten wurde - muss ein Bearbeitungsunfall gewesen sein. Ich werde das auch beheben.) Ich werde das untersuchen abgestimmtes Framework und die anderen Tools. Vielen Dank für Ihre Vorschläge.
Mhucka
Ich habe versucht tuned, das Profil zu verwenden virtual-guestund alles andere gleich zu halten (richtige experimentelle Technik - vermeiden Sie es, mehr als eine Variable zu ändern). Es hatte keinen Einfluss auf das Verhalten: Nach wie vor laufen die Dinge gut an, aber nach vielen wiederholten Läufen (10-30) dd if=/dev/zero of=/test.img bs=16k count=256k conv=fdatasync oflag=directsinkt die Leistung um die Hälfte. Ich habe auch versucht, Profil latency-performance- gleiches Ergebnis. Ich versuche es gerade throughput-performance.
Mhucka
Können Sie etwas ausprobieren, das keine ddLäufe beinhaltet ? Vielleicht das fiooder iozonefrüher erwähnt?
ewwhite
Ich werde. Aber zuerst war es sinnvoll, denselben Test zu wiederholen, um festzustellen, ob sich das Verhalten geändert hat.
Mhucka
2

Ich bin auf dasselbe Problem gestoßen und habe eine sehr langsame Laufwerksleistung in virtuellen Maschinen festgestellt. Ich verwende ESXi 5.5 auf einem Seagate ST33000650NS.

Durch Befolgen dieses KB-Artikels habe ich die Disk.DiskMaxIOSizeBlockgröße meiner Festplatten geändert . In meinem Fall 4096.

Der VMware-Hinweis dazu ist sehr schön, da Sie ihn einfach testen können.

Hinweis: Sie können diese Änderung vornehmen, ohne den ESX / ESXi-Host neu zu starten oder ohne den ESX / ESXi-Host in den Wartungsmodus zu versetzen.

Ich weiß, dass diese Frage sehr alt ist, aber mhucka hat so viel Energie und Informationen in seinen Beitrag gesteckt, dass ich sie beantworten musste.

Edit # 1: Nachdem ich 4096 für einen Tag verwendet hatte, wechselte ich zurück zum alten Wert 32767. Das Testen der E / A und alles scheint immer noch stabil zu sein. Ich vermute, dass das Ausführen eines ESXi auf einer normalen Festplatte mit der Disk.DiskMaxIOSizeEinstellung auf 32767für einige Stunden oder vielleicht Tage einwandfrei funktioniert. Möglicherweise müssen die VMs etwas belastet werden, um die Leistung schrittweise zu verringern.

Ich versuche zu untersuchen und komme später wieder ...

Chanz
quelle
Vielen Dank für das Teilen. Es ist hilfreich zu wissen, wie die Plattenblockgröße geändert wird. Ich bedauere, dass ich es nicht testen kann, weil ich diese Konfiguration nicht mehr habe (ich habe sie schließlich fallen gelassen und bin mit CentOS auf Bare Metal gegangen), aber wenn ich jemals wieder so etwas versuche, können Sie sicher sein, dass ich mich darum kümmern werde .
Mhucka
Ich habe versucht, hohe Latenzzeiten auf meinem esxi 6.5 auf dem ProLiant 380 Gen9-Computer herauszufinden. Disk.DiskMaxIOSizehat den Trick für mich gemacht. Ich habe jetzt 2 Wochen lang geforscht und gemessen. Danke für das Teilen.
EvanBlack