Sto davvero cercando di capire perché le nostre VM guest non utilizzano il driver kvm-clock "come dovrebbero". Stanno eseguendo RHEL 7.2, glibc-2.17, kern 3.10.0. Programmi come date
e perl -e 'print time'
ottenere l'ora corrente, ma farlo senza effettuare una chiamata di sistema. Ciò è confermato con strace e ltrace e ulteriormente confermato utilizzando gdb e tracciando tramite assembly che ha ignorato il syscall
e invece ha eseguito alcune istruzioni chiamate rtdscp
.
È un tentativo di ottimizzazione da parte degli autori di glibc? C'è un modo per disabilitarlo e forzare le chiamate glibc a effettuare la chiamata di sistema (a meno di LD_PRELOAD hack)?
AGGIORNAMENTO 14-10-2016:
Dopo aver esaminato l'ultima bozza di POSIX, parte della risposta è chiara:c'è un modo per richiedere l'orologio dalla CPU, ma GNU glibc ha forzato erroneamente questa implementazione ai suoi utenti. La soluzione alternativa consiste nell'invocare direttamente la chiamata di sistema. (Booooh)
Se _POSIX_CPUTIME è definito, le implementazioni supporteranno i valori di clock ID ottenuti invocando clock_getcpuclockid(), che rappresentano l'orologio della CPU di un determinato processo. Le implementazioni supportano anche lo speciale valore clockid_t CLOCK_PROCESS_CPUTIME_ID, che rappresenta l'orologio della CPU del processo chiamante quando si richiama uno dei clock_() o timer_ () funzioni.
Dato che l'utente può Esiste un vero argomento contro l'idea che se clock_id
è impostato su CLOCK_REALTIME
, è necessario utilizzare la chiamata di sistema?
Risposta accettata:
Penso che il motivo per cui non vedi una syscall in corso sia che alcune chiamate di sistema Linux (in particolare quelle relative al tempo, come gettimeofday(2)
e time(2)
) hanno implementazioni speciali tramite vDSO, che contiene implementazioni in qualche modo ottimizzate di alcune syscall:
Il “vDSO” (virtual dynamic shared object) è una piccola libreria condivisa
che il kernel mappa automaticamente nello spazio degli indirizzi di tutte le
applicazioni dello spazio utente.
Ci sono alcune chiamate di sistema fornite dal kernel
che il codice dello spazio utente finisce per essere usato frequentemente, al punto
che tali chiamate possono dominare le prestazioni complessive. Ciò è dovuto
sia alla frequenza della chiamata che all'overhead del cambio di contesto
che risulta dall'uscita dallo spazio utente e dall'ingresso nel
kernel.
Ora, il manuale menziona che le informazioni richieste sono semplicemente memorizzate in modo che un processo possa accedervi direttamente (l'ora corrente non è un gran segreto, dopotutto). Non conosco l'esatta implementazione e posso solo immaginare il ruolo del contatore del timestamp della CPU in esso.
Quindi, non è proprio glibc a fare un'ottimizzazione, ma il kernel. Può essere disabilitato impostando vdso=0
sulla riga di comando del kernel e dovrebbe essere possibile compilarlo. Tuttavia, non riesco a trovare se è possibile disabilitarlo sul lato glibc (almeno senza patchare la libreria).
Ci sono un sacco di altre informazioni e fonti su questa domanda su SE.
Hai detto nella domanda:
Dopo aver esaminato l'ultima bozza POSIX, parte della risposta è chiara:c'è un modo per richiedere l'orologio dalla CPU, ma GNU glibc ha forzato erroneamente questa implementazione ai suoi utenti.
Che penso sia un'affermazione piuttosto audace. Non vedo alcuna prova di "forzare erroneamente" qualcosa sugli utenti, almeno non a loro svantaggio. L'implementazione vDSO è utilizzata da quasi tutti i processi Linux in esecuzione sui sistemi attuali, il che significa che se non avesse funzionato correttamente, si sarebbero già sentiti dei reclami molto rumorosi. Anche tu stesso hai detto che l'ora ricevuta è corretta.
La citazione che dai da clock_gettime
il manuale sembra menzionare solo che la chiamata deve supportare gli ID dell'orologio restituiti da clock_getcpuclockid
, niente sul comportamento di CLOCK_REALTIME
o gettimeofday
.