Brendan Gregg, jeden z vývojářů DTrace, který nyní vyvíjí nástroje pro analýzu výkonu založené na BPF v jádře Linux, shrnul zkušenosti získané při řešení problémů s výkonem, s nimiž se společnost Netflix setkala při migraci databáze Cassandra z CentOS na Ubuntu v prostředích běžících na cloudu Amazon EC2 na základě Xen. Po migraci se zátěž na CPU zvýšila o 30 % a zpoždění při provádění zapisovacích operací vzrostlo přibližně o tolik. Jak se ukázalo, výkon aplikací, které intenzivně vyžadují informace o čase, velmi silně závisí na vybraném zdroji přesného času v systému.
Zpočátku nebyla příčina snížení výkonu zřejmá a diagnostika začala sledováním možného vlivu neustále běžících nebo příležitostně spouštěných náročných systémových procesů pomocí utilit top a execsnoop. Všechno však ukazovalo na to, že spotřeba zdrojů vzrostla především v databázi Cassandra, napsané v jazyce Java. Srovnání profilovacích výsledků dvou procesů Cassandra, které byly spuštěny paralelně v CentOS a Ubuntu a zpracovávaly stejné dotazy, ukázalo, že přibližně 32 % celkového času je tráveno voláním os::javaTimeMillis(), používané k získání informací o aktuálním čase.
Poté byl proveden experiment, během kterého byla napsána jednoduchá aplikace v jazyce Java, která v cyklu volala metodu System.currentTimeMillis() sto milionkrát. Spuštění aplikace ukázalo, že v CentOS trvalo její provedení 13 sekund, zatímco v Ubuntu to bylo přibližně 68 sekund, tj. 5krát pomalejší. V jazyce C byla napsána podobná aplikace, která sto milionkrát volala funkci gettimeofday(), ale při jejím provádění byly získány podobné výsledky.
Jakmile bylo jasné, že zdrojem problému je funkce vracení aktuálního času, pozornost se obrátila na změnu parametrů při výběru různých zdrojů přesného času v systému. Podle obsahu "/sys/devices/system/clocksource/clocksource0/current_clocksource" se při spuštění Linuxu ve virtuálním systému výchozí hodiny použily "xen". Po změně zdroje času na "tsc" se doba běhu testovací aplikace v Ubuntu zkrátila z 68 na 3,3 sekundy, tedy byla 20krát rychlejší. Dále byl proveden test výkonu hodinového zdroje kvm-clock, který ukázal zvýšení latencí o 20 % ve srovnání s TSC. $ 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
Pro získání času při výběru zdroje TSC se používá procesorový instrukce RDTSC, jejíž provedení nevyžaduje systémový volání (instrukce nevyžaduje zvýšené oprávnění a vrací hodnotu z vestavěného časovače CPU). TSC není ve výchozím nastavení aktivován, protože v minulosti tento zdroj neznemožňoval pomalý drift času, který byl v jiných zpracovatelích softwarově korigován pro dosažení přesnějších měření. Podle inženýra specializujícího se na vývoj procesorů obavy o časové posuny při používání TSC již dávno neodpovídají skutečnosti a moderních procesorech tento zdroj může po léta poskytovat stabilní hodnoty.
Přechod k pracovnímu servery v Netflixu na zdroj TSC vedl k poklesu latencí při zápisu o 43 % a dosáhl výsledků v Ubuntu, které čtyřikrát překonávaly konfigurace s CentOS a zdrojem času "xen". Výsledky provedeného výzkumu byly předány společnosti Amazon, která oficiálně doporučila používat ve výchozím nastavení zdroj času TSC v prostředích AWS EC2 založených na hypervizoru Xen (v prostředích založených na hypervizoru Nitro zůstává doporučená kvm-clock).
Zdroj: opennet.ru
