Brendan Gregg, einer der Entwickler von DTrace, der derzeit Werkzeuge zur Leistungsanalyse auf Basis von BPF im Linux-Kernel entwickelt, hat die Erfahrungen zusammengefasst, die bei der Analyse von Leistungsproblemen gemacht wurden, mit denen Netflix konfrontiert war, als die Datenbank Cassandra von CentOS auf Ubuntu in Amazon EC2-Umgebungen auf Basis von Xen migriert wurde. Nach der Migration stieg die CPU-Auslastung um 30 %, und die Latenzen bei Schreiboperationen erhöhten sich ebenfalls um etwa denselben Betrag. Wie sich herausstellte, hängt die Leistung von Anwendungen, die intensiv Zeitabfragen durchführen, stark von der im System gewählten Quelle für die genaue Zeit ab.
Zunächst war der Grund für die Leistungsabnahme nicht offensichtlich, und die Diagnose begann mit der Überwachung des möglichen Einflusses von ständig laufenden oder gelegentlich gestarteten ressourcenintensiven Systemprozessen mithilfe der Tools top und execsnoop. Doch alles deutete darauf hin, dass der Ressourcenverbrauch insbesondere in der Cassandra-Datenbank, die in Java geschrieben ist, angestiegen ist. Der Vergleich der Profildaten zweier Cassandra-Prozesse, die parallel unter CentOS und Ubuntu liefen und dieselben Anfragen bearbeiteten, ergab, dass etwa 32 % der gesamten Zeit für den Aufruf von os::javaTimeMillis() aufgewendet werden, welches zur Abfrage der aktuellen Zeit verwendet wird.
Daraufhin wurde ein Experiment durchgeführt, bei dem eine einfache Anwendung in Java geschrieben wurde, die in einer Schleife den Methodenaufruf System.currentTimeMillis() hundert Millionen Mal auslöste. Die Ausführung der Anwendung zeigte, dass CentOS dafür 13 Sekunden benötigte, während Ubuntu dafür etwa 68 Sekunden benötigte, also fünfmal langsamer war. Ein ähnliches Programm in C, das die Funktion gettimeofday() hundert Millionen Mal aufrief, ergab jedoch vergleichbare Ergebnisse.
Nachdem klar wurde, dass die Ursache des Problems die Funktion zur Rückgabe der aktuellen Uhrzeit war, wurde der Fokus auf die Veränderung der Messwerte gelegt, indem in der Systemkonfiguration verschiedene Zeitquellen ausgewählt wurden. Laut dem Inhalt von «/sys/devices/system/clocksource/clocksource0/current_clocksource» wurde beim Start von Linux in der Gastsystemumgebung standardmäßig der Timer «xen» verwendet. Nach der Änderung der Zeitquelle auf «tsc» verringerte sich die Ausführungszeit der Testanwendung in Ubuntu von 68 auf 3,3 Sekunden, d.h. sie wurde 20-mal schneller. Zudem wurde ein Leistungstest der Zeitquelle kvm-clock durchgeführt, der eine Erhöhung der Latenzen um 20% im Vergleich zu TSC zeigte. $ cat /sys/devices/system/clocksource/clocksource0/available_clocksource xen tsc hpet acpi_pm $ cat /sys/devices/system/clocksource/clocksource0/current_clocksource xen $ time java TimeBench real 1m8.300s user 0m38.337s sys 0m29.875s $ echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource $ time java TimeBench real 0m3.370s user 0m3.353s sys 0m0.026s
Um die Zeit bei der Auswahl der TSC-Quelle zu erhalten, verwendet die CPU-Instruktion RDTSC, deren Ausführung keinen Systemaufruf erfordert (die Instruktion benötigt keine erhöhten Berechtigungen und gibt einen Wert aus dem im CPU integrierten Zeitstempelzähler aus). Standardmäßig wird TSC nicht aktiviert, da diese Quelle in der Vergangenheit keinen schrittweisen Zeitdrift ausschloss, der in anderen Treibern softwareseitig zur Erreichung genauerer Messungen korrigiert wird. Laut einem Ingenieur, der auf die Entwicklung von Prozessoren spezialisiert ist, sind die Bedenken bezüglich Zeitverschiebungen bei der Nutzung von TSC längst überholt und in modernen Prozessoren kann diese Quelle über Jahre hinweg stabile Messwerte liefern.
Übersetzung der Arbeit Server Bei Netflix führte der Einsatz der TSC-Zeitquelle zu einer Verringerung der Latenzzeiten beim Schreiben um 43 % und erreichte mit Ubuntu Ergebnisse, die die Konfigurationen mit CentOS um das Vierfache übertrafen, wenn die Zeitquelle "xen" verwendet wurde. Die Ergebnisse der durchgeführten Studie wurden an Amazon übermittelt, das offiziell empfohlen hat, in AWS EC2-Umgebungen, die auf dem Xen-Hypervisor basieren, standardmäßig die TSC-Zeitquelle zu verwenden (in Umgebungen, die auf dem Nitro-Hypervisor basieren, bleibt kvm-clock empfohlen).
Quelle: opennet.ru
