Brendan Gregg, einer der Entwickler von DTrace, der derzeit Werkzeuge zur Analyse der Leistungsfähigkeit auf Basis von BPF im Linux-Kernel entwickelt, hat die Erfahrungen zusammengefasst, die während der Analyse von Leistungsproblemen bei Netflix bei der Migration der Datenbank Cassandra von CentOS nach Ubuntu in Amazon EC2-Umgebungen auf Basis von Xen gesammelt wurden. Nach der Migration stieg die CPU-Auslastung um 30 % und die Verzögerungen bei Schreiboperationen nahmen ebenfalls um etwa diesen Wert zu. Es stellte sich heraus, dass die Leistung von Anwendungen, die zeitintensive Informationen abfragen, stark von der gewählten Zeitquelle im System abhängt.
Zunächst war der Grund für den Rückgang der Leistung nicht offensichtlich, und die Diagnose begann mit der Überwachung möglicher Auswirkungen ständig laufender oder periodisch gestarteter ressourcenintensiver Systemprozesse mithilfe der Tools top und execsnoop. Doch alles deutete darauf hin, dass der Ressourcenverbrauch insbesondere in der Cassandra-Datenbank, die in Java geschrieben wurde, gestiegen war. Der Vergleich der Profilierungsdaten zweier Cassandra-Prozesse, die parallel in CentOS und Ubuntu liefen und die gleichen Anfragen bearbeiteten, ergab, dass etwa 32 % der gesamten Zeit für den Aufruf os::javaTimeMillis() verwendet wurden, der zur Abfrage der aktuellen Zeit dient.
Anschließend wurde ein Experiment durchgeführt, bei dem eine einfache Anwendung in Java geschrieben wurde, die die Methode System.currentTimeMillis() hundert Millionen Mal in einer Schleife aufruft. Der Start der Anwendung zeigte, dass unter CentOS 13 Sekunden dafür benötigt wurden, während es unter Ubuntu etwa 68 Sekunden dauert, also fünfmal langsamer. Ein ähnliches Programm wurde in C geschrieben, welches die Funktion gettimeofday() hundert Millionen Mal aufruft, wobei ähnliche Ergebnisse erzielt wurden.
Da es klar wurde, dass die Quelle des Problems die Funktion zur Rückgabe der aktuellen Zeit war, wurde die Aufmerksamkeit auf die Anpassung der Metriken bei der Auswahl verschiedener Zeitquellen im System gerichtet. Laut dem Inhalt von "/sys/devices/system/clocksource/clocksource0/current_clocksource" wurde standardmäßig beim Start von Linux im Gastbetriebssystem 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, was einer Steigerung der Geschwindigkeit um das 20-Fache entspricht. Zusätzlich wurde ein Leistungstest der Zeitquelle kvm-clock durchgeführt, der eine Erhöhung der Latenz 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
Zum Empfang der Zeit bei der Auswahl der TSC-Quelle wird die Prozessoranweisung RDTSC verwendet, deren Ausführung keinen Systemaufruf erfordert (die Anweisung benötigt keine erhöhten Berechtigungen und gibt einen Wert aus dem im CPU integrierten Zeitgeber aus). Standardmäßig wird TSC nicht aktiviert, da in der Vergangenheit diese Quelle keinen allmählichen Drift der Zeit ausgeschlossen hat, der in anderen Handlern softwaremäßig zur Erreichung genauerer Messwerte korrigiert wird. Laut einem Ingenieur, der auf die Entwicklung von Prozessoren spezialisiert ist, sind die Bedenken über Zeitverschiebungen bei der Verwendung von TSC schon lange überholt und modernen Prozessoren diese Quelle kann Jahre lang stabile Messwerte liefern.
Übersetzung der Arbeitszeit Server bei Netflix auf die TSC-Quelle führte zu einer Verringerung der Latenz bei der Aufnahme um 43 % und erzielte in Ubuntu Ergebnisse, die die Konfiguration mit CentOS und der Zeitquelle "xen" um das 4-Fache übertrafen. Die Ergebnisse der durchgeführten Untersuchung wurden an die Firma Amazon übergeben, die offiziell empfohlen hat, in AWS EC2-Umgebungen, die auf dem Xen-Hypervisor basieren, standardmäßig die Zeitquelle TSC zu verwenden (in Umgebungen, die auf dem Nitro-Hypervisor basieren, bleibt kvm-clock empfohlen).
Quelle: opennet.ru
