Code: Select all
uint64_t getTimeLatencyNs() {
struct timespec ts1;
struct timespec ts2;
clock_gettime(CLOCK_MONOTONIC_RAW, &ts1);
clock_gettime(CLOCK_MONOTONIC_RAW, &ts2);
return ((ts2.tv_sec - ts1.tv_sec) * NSEC + ts2.tv_nsec - ts1.tv_nsec);
}
Code: Select all
clock_gettime()
Da Linux 2.6.21 ist, ermöglicht die Konfiguration_High_res_timers HRTIMERER, eine höhere Auflösung zu erreichen, so die MAN TIME . Auf meinem System wird die Konfiguration auf Ja gesetzt. Also habe ich mich über hrtimer gelesen. Aber Hrtimer -Dokumente sagen, dass sie nicht für Uhren verwendet werden. Sie sagen jedoch, sie planen, es umzusetzen. Derzeit suche ich immer noch nach einem Hrtimer, der die clock_getime () Kernelquelle überholt. /> baeldung (Erläuterung von 2024)
Suchen Sie mehr, der Baeldung -Artikel "Zeitmessung und Takten in Linux" aus 2024 erklärt VDSO als Aktivieren von Clock_getTime () ohne das syscall overhead, indem Sie die Funktion von Kern -Raum in den Benutzerraum in den User Raum machten. Es hat auch ein interessantes Zitat: < /p>
Der VDSO kann Latenzspikes einführen, wenn die Kernel gemeinsam genutzten Speicherbereiche mit Taktzähnen aktualisieren. Diese Situation tritt eher auf, wenn Uhren vom VDSO beschleunigt werden. In ähnlicher Weise behauptet diese Antwort, clock_gettime () Ausreißer, die durch Aktualisierungen des gemeinsamen Speichers verursacht werden sollen, und ein bestimmtes DO -Treffer aufzunehmen ... während (unwahrscheinlich ...) Fall. Ich bin mir nicht sicher, ob die Erklärung, da der durchschnittliche Aufruf in dieser Frage einige nano Sekunden dauert, während die Ausreißer im zweiten Bereich micro liegen. Ein weiterer Lauf dieser Schleife sollte nur Nano Sekunden dauern. Ich habe eine Antwort erhalten, die besagt, dass AMDN auf den neuesten Hardware clock_getTime () aus dem ständig wachsenden TSC -Register erklärt wird, warum es ständig zunimmt. Ich gehe davon aus, dass dies auf meiner Maschine am Ende verwendet wird, um die hohe Auflösung zu erreichen, da es sich um eine relativ jüngste X86 -Maschine handelt.
Es gibt ähnliche Register auf anderen Plattformen, z. ARM's CCNT, aber wahrscheinlich der gemeinsame Code ist sowieso um den Registerzugriff gewickelt. Ist diese Erklärung der Kernelquellen clock_getTime ab 2013? Abhängig von der Kernel -Konfiguration wird der freigegebene Speicher entweder regelmäßig über Jiffies aktualisiert (
Code: Select all
CONFIG_HZ
Code: Select all
CONFIG_NO_HZ
Code: Select all
$ cat /boot/config | grep _HZ
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
# CONFIG_NO_HZ_IDLE is not set
CONFIG_NO_HZ_FULL=y
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
Soweit ich verstehe, dauert ein Aufruf an clock_getTime () aufgrund des VDSO -Mechanismus normalerweise nur wenige Nanosekunden. Trotzdem gibt es Ausreißer, die einige Fragen zum Verhalten von clock_getTime () < /code> und seines Timings ausgelöst haben. Bevor ich mich in die Kernelquelle und /oder in Ftrace eingraben, fand ich es fair, die Community zu fragen. Bei Bedarf kann ich ein Bild meines Verständnisses zeichnen.>