Brendan Gregg, uno dei creatori di DTrace, che attualmente sviluppa strumenti per l'analisi delle prestazioni basati su BPF nel kernel Linux, ha riassunto l'esperienza acquisita nell'affrontare i problemi di prestazioni che Netflix ha incontrato durante la migrazione del database Cassandra da CentOS a Ubuntu in ambienti eseguiti su Amazon EC2 basati su Xen. Dopo la migrazione, il carico sulla CPU è aumentato del 30% e le latenze durante le operazioni di scrittura sono aumentate di circa la stessa percentuale. Come si è scoperto, le prestazioni delle applicazioni che richiedono intensamente informazioni sul tempo dipendono fortemente dalla sorgente di tempo precisa selezionata nel sistema.
All'inizio, il motivo del calo delle prestazioni non era evidente e la diagnosi è iniziata monitorando il possibile impatto di processi di sistema ad alta intensità di risorse, in esecuzione continua o avviati periodicamente, utilizzando le utility top e execsnoop. Ma tutto indicava che il consumo delle risorse era aumentato specificamente nel database Cassandra, scritto in Java. Il confronto delle metriche di profiling di due processi Cassandra, eseguiti parallelamente su CentOS e Ubuntu e che trattavano le stesse richieste, ha mostrato che circa il 32% del tempo veniva speso nella chiamata a os::javaTimeMillis(), utilizzata per ottenere informazioni sull'ora corrente.
Successivamente, è stato condotto un esperimento nel quale è stata scritta una semplice applicazione in Java, che nel ciclo chiamava cento milioni di volte il metodo System.currentTimeMillis(). L'esecuzione dell'applicazione ha mostrato che su CentOS ci sono voluti 13 secondi per completare, mentre su Ubuntu circa 68 secondi, ovvero 5 volte più lentamente. È stata scritta una programmazione simile in C, che chiamava cento milioni di volte la funzione gettimeofday(), ma durante la sua esecuzione sono stati ottenuti risultati analoghi.
Poiché è diventato chiaro che la funzione di recupero dell'ora corrente era la fonte del problema, l'attenzione si è spostata sulla modifica dei parametri scegliendo diversi fonti di tempo nella sistemazione. A giudicare dal contenuto di "/sys/devices/system/clocksource/clocksource0/current_clocksource", per impostazione predefinita all'avvio di Linux nel sistema ospite veniva utilizzato il timer "xen". Dopo aver cambiato la fonte di tempo su "tsc", il tempo di esecuzione dell'applicazione di test in Ubuntu è diminuito da 68 a 3,3 secondi, ovvero è diventato più veloce di 20 volte. È stato inoltre eseguito un test delle prestazioni della fonte di tempo kvm-clock, che ha mostrato un aumento dei ritardi del 20% rispetto a 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
Per ottenere il tempo nella scelta della sorgente TSC, viene utilizzata l'istruzione del processore RDTSC, il cui esecuzione non richiede una chiamata di sistema (l'istruzione non necessita di privilegi elevati e restituisce un valore dal contatore del tempo integrato nella CPU). Di default, il TSC non è attivato poiché in passato questa sorgente non escludeva il graduale drift temporale, che in altri gestori viene corretto tramite software per ottenere letture più accurate. Secondo un ingegnere specializzato nello sviluppo di processori, le preoccupazioni sui cambiamenti temporali nell'uso del TSC non sono più valide e nei processori moderni questa sorgente può fornire letture stabili per anni.
Traduzione operativa server In Netflix, the TSC time source led to a 43% reduction in recording latency using Ubuntu, achieving results four times better than configurations with CentOS utilizing the 'xen' time source. The study's findings were shared with Amazon, which officially recommended using the TSC time source by default in AWS EC2 environments based on the Xen hypervisor (for Nitro-based environments, kvm-clock remains the recommendation).
Fonte: opennet.ru
