Unsere Erfahrungen mit Ceph - Teil 3

nine Team Jan 9, 2017

Im dritten und letzten Teil unserer Blog-Serie zu unseren Ceph-Erfahrungen berichten wir über den letzten Schliff unseres NVMe-Ceph-Clusters.

Benchmarks in den VMs

Nach der Sammlung diverser Eckdaten des gesamten Clusters begannen wir mit dem Testen der Schreib- und Lesegeschwindigkeit direkt in den VMs, welche den Storage benutzen. Bei diesen Benchmarks experimentierten wir zudem mit verschiedenen Einstellungen und vor allem mit unterschiedlichen Prozessoren.

Der erste Test basierte pro Node auf zwei Intel E5-2630 v4 (10x 2.2Ghz) Prozessoren. Diese Prozessoren wählten wir dann auch für das produktive Setup, da der Preis der anderen CPUs für die minimale Steigerung der Performance zu hoch war.

Mit diesem ersten CPU kamen wir zu folgenden Testresultaten:

Test\Blocksize 4k 16k 4096k
Serial Write 14908 IOPS 12650 IOPS 184 IOPS / 739.24 MB/s
Serial Read 1212 IOPS 1095 IOPS 77 IOPS / 310.22 MB/s
Random Write 9886 IOPS 8382 IOPS 170 IOPS / 681.58 MB/s
Random Read 1074 IOPS 949 IOPS 66 IOPS / 264.70 MB/s

Die darauffolgende zweite Testserie nutzte zwei Intel E5-2680 v4 (14x 2.4Ghz) Prozessoren:

Test\Blocksize 4k 16k 4096k
Serial Write 15209 IOPS 12702 IOPS 131 IOPS / 527.70 MB/s
Serial Read 1387 IOPS 1287 IOPS 81 IOPS / 326.53 MB/s
Random Write 9026 IOPS 9097 IOPS 137 IOPS / 550.10 MB/s
Random Read 1103 IOPS 1097 IOPS 80 IOPS / 320.30 MB/s

Für den letzten Test mit unterschiedlichen CPUs verwendeten wir wieder Intel E5-2680 v4 Prozessoren - dieses Mal jedoch nur mit 10 anstelle der eigentlichen 14 Kerne. Dieser finale Test diente hauptsächlich dazu, herauszufinden, ob die Taktung der Kerne oder die Anzahl der Kerne entscheidende Performance-Änderungen bringt.

Test\Blocksize 4k 16k 4096k
Serial Write 15713 IOPS 12981 IOPS 153 IOPS / 615.38 MB/s
Serial Read 1371 IOPS 1254 IOPS 99 IOPS / 397.05 MB/s
Random Write 9645 IOPS 8458 IOPS 142 IOPS / 568.25 MB/s
Random Read 1271 IOPS 1004 IOPS 66 IOPS / 264.50 MB/s

Aus allen gesammelten Resultaten kristallisierte sich für uns heraus, dass sich schnellere CPUs nicht lohnen, wenn wir mit diesen nur etwa dieselben Resultate erzielten wie mit 10x2.2Ghz.

Mit den Ergebnissen erhielten wir zudem einen guten Überblick über die Performance einzelner virtueller Maschinen. Es war für uns wichtig herauszufinden, ab welcher Last eine Beeinträchtigung der Geschwindigkeit auf einer Maschine des Clusters spürbar ist. Dazu erzeugten wir auf dem Cluster eine Grundlast, welche von mehreren parallel laufenden FIO Jobs erzeugt wurde. In einer spezifischen virtuellen Maschine testeten wir anschliessend die Performance bei der jeweiligen Grundlast. Zur Erzeugung dieser Basislast nutzen wir folgende FIO Parameter:

[global]
invalidate=1
ioengine=rbd
iodepth=1
time_based
runtime=7200
size=10G
bsrange=4k-4m
rw=randrw
direct=1
buffered=0
percentage_random=50
rate=5M
pool=volumes
clientname=libvirt

Wir haben mit diesen Parametern viele verschiedene Last-Profile getestet, jedoch bei dauerhaftem Lesen von unter 1GB/s und ca. 1.5GB/s Schreiblast keine wirkliche Veränderung wahrgenommen. Nach dem Erreichen dieser Werte erhielten wir folgende Messwerte in einer VM:

Test\Blocksize 4k 16k 4096k
Serial Write 13770 IOPS 7895 IOPS 34 IOPS / 136.75 MB/s
Serial Read 498 IOPS 447 IOPS 14 IOPS / 58.04 MB/s
Random Write 10278 IOPS 8410 IOPS 33 IOPS / 135.63 MB/s
Random Read 344 IOPS 268 IOPS 13 IOPS / 53.73 MB/s

Die Messungen bei ca. 50MB/s lesender und 110MB/s schreibender Basislast sahen so aus:

Test\Blocksize 4k 16k 4096k
Serial Write 15187 IOPS 12799 IOPS 170 IOPS / 681.30 MB/s
Serial Read 1155 IOPS 1126 IOPS 49 IOPS / 196.45 MB/s
Random Write 10064 IOPS 8646 IOPS 170 IOPS / 680.40 MB/s
Random Read 933 IOPS 859 IOPS 53 IOPS / 214.31 MB/s

Mehr OSDs pro NVMe

Nach den umfangreichen Tests interessierten wir uns nun noch für einen möglichen Einfluss von mehr OSDs pro NVMe auf die Geschwindigkeit des Clusters. Um dies herauszufinden bauten wir unseren Cluster so um, dass wir auf jeder NVMe neu 2 OSDs und entsprechend auch zwei Journal-Partitionen hatten. Dieser Umbau hatte vor allem auf die Lesegeschwindigkeit einen erheblichen Einfluss, wohingegen die Schreibperformance nur ein wenig litt:

Test\Blocksize 4k 16k 4096k
Serial Write 14686 IOPS 12407 IOPS 128 IOPS / 515.33 MB/s
Serial Read 1719 IOPS 1546 IOPS 104 IOPS / 416.01 MB/s
Random Write 9377 IOPS 8900 IOPS 122 IOPS / 488.29 MB/s
Random Read 1401 IOPS 1323 IOPS 106 IOPS / 427.72 MB/s

Um auch hier das Verhalten bei höherer Auslastung des Ceph-Storages zu sehen, generierten wir wiederum etwa 1GB Lese- und 1.5GB Schreiblast:

Test\Blocksize 4k 16k 4096k
Serial Write 13909 IOPS 9724 IOPS 38 IOPS / 154.25 MB/s
Serial Read 519 IOPS 495 IOPS 18 IOPS / 72.13 MB/s
Random Write 9689 IOPS 9609 IOPS 38 IOPS / 155.38 MB/s
Random Read 293 IOPS 311 IOPS 18 IOPS / 73.02 MB/s

So machte sich dann eine doch erhebliche Verbesserung gegenüber der Konfiguration mit nur einer OSD auf jedem NVMe-Device bemerkbar.

Zum Schluss versuchten wir zur Leistungssteigerung einen Lösungsansatz von Samsung, der in Zusammenarbeit mit RedHat als beste Variante vorgeschlagen wurde. Mit dem empfohlenen Upgrade auf 4 OSDs pro NVMe konnten wir keine Steigerung der Leistung feststellen, bemerkten sogar eine Verschlechterung beim Schreiben und Lesen grösserer Blöcke. Somit waren unsere Benchmarks nun abgeschlossen und mit 2 OSDs pro NVMe konnten wir das Performance-Optimum aus der Hardware herausholen.

Ausfallsicherheit

Um zum Abschluss der verschiedenen Tests nun noch die Ausfallsicherheit unseres Setups zu testen, simulierten wir unter Last verschiedene Ausfallszenarien:

NVMe-Ausfall

Den Ausfall einer NVMe-Disk simulierten wir im laufenden Betrieb und mit einiger Last auf dem Cluster, indem wir eine NVMe aus dem Server herauszogen.

Dies resultierte darin, dass einige Sekunden lang keine IO-Operationen mehr möglich waren. Danach arbeitete der Storage wieder normal weiter und es konnten keine Einbussen auf den VMs festgestellt werden.

Im produktiven Betrieb ist dieser Ausfall genügend kurz, sodass in den virtuellen Maschinen keine Beeinträchtigung gespürt werden sollte.

NVMe-Ausfall mit Neuverteilung

Mit diesem Szenario testeten wir mögliche Probleme mit der Performance durch das Herausziehen einer NVMe-Disk und einer Wartezeit bis alle Daten wieder neu verteilt wurden. Ein weiteres Ziel dieses Versuch war festzustellen, wie lange es dauert, bis alle Daten wieder korrekt redundant vorhanden sind.

Das Resultat betrug 5 Minuten. Diese Zeitspanne ab dem Herausziehen der Disk benötigte der Cluster, sich selbst wieder zu reparieren. Hierzu musste er einiges an Daten kopieren, was jedoch bei den VMs nicht spürbar war. Für den Test waren etwa 6182GB Daten auf dem Cluster vorhanden, wodurch der Recovery ca. 20 Minuten dauerte.

Nodeausfall

Diese Situation stellten wir nach, um herauszufinden, was im Falle eines Cluster-Node-Ausfalls durch beispielsweise einen Stromausfall oder bei einem Reboot geschieht.

Wir generierten auch hier wieder viel Load auf dem Cluster, bevor wir einem Node den Strom entzogen. Das Verhalten ähnelte dem Ausfall eines OSD sehr. Der Cluster verarbeitete demnach einige Sekunden lang keine IO-Operationen, funktionierte danach aber wieder korrekt. Auch hier begann nach ca. 5 Minuten das Recovery der “verlorenen” Daten.

Selbst ein Reboot eines Ceph-Servers zeigte dieselben Auswirkungen. Es konnten für einige Sekunden keine IO-Operationen durchgeführt werden, doch danach lief der Cluster wieder normal. Die Daten, welche in der Zeit des Reboots nicht redundant gespeichert werden konnten, wurden nun in sehr kurzer Zeit synchronisiert.

Produktionsumgebung

Nach Abschluss aller Tests konnten wir die Hardware aus den Lab-Racks in die produktive Umgebung umziehen. Nach dem Umzug führten wir noch einen Performance-Test durch, um unsere Ergebnisse aus dem Lab auch in der Produktionsumgebung zu verifizieren. Aufgrund einer weiteren Empfehlung von RedHat migrierten wir die Server zusätzlich von Ubuntu Trusty auf Ubuntu Xenial. Durch den abschliessenden Performance-Test konnten wir zusätzlich ausschliessen, dass das Distributions-Upgrade Auswirkungen auf die Performance des Clusters hatte.

Hier finden Sie den ersten und zweiten Teil der Serie.