Ich habe einen Java-Prozess verfolgt, der eine Menge Kernel-Zeit ausgelöst hat, um zu sehen, welche syscalls verwendet wurden, und war überrascht, dass gettimeofday()
und clock_gettime()
dominiert (ich vermute, dass es aufgrund der Protokollierung ist), was seltsam ist, wenn man bedenkt, dass man vdso
states:gettimeofday() ohne vDSO?
Bei der Rückverfolgung von Systemaufrufen mit strace (1) werden Symbole (Systemaufrufe), die vom vDSO exportiert werden, nicht in der Trace-Ausgabe angezeigt.
Wie kommen diese Systemaufrufe? Gibt es eine Möglichkeit, sie zu vermeiden?
Die Maschine läuft Ubuntu 16.04.1 auf EC2.
Um die Dinge zu vereinfachen, habe ich ein minimales Testprogramm in C (testgtod.c
):
#include <stdlib.h>
#include <sys/time.h>
void main(void)
{
struct timeval tv;
for(int i = 0; i < 1000; i++) {
/* glibc wrapped, shouldn't actually syscall */
gettimeofday(&tv, NULL);
}
}
ich dann das Programm unter strace kompiliert und lief: gcc testgtod.c -o testgtod && sudo strace ./testgtod
Der Ausgang tausend Anrufe enthalten gettimeofday(), trotz meiner Erwartung.
Dinge, die ich getestet, um sicherzustellen, ich sehe die Dinge nicht:
sorgte dafür, dass der binäre ist eine 64-Bit-Elf
file
ldd ./testgtod
mit, um sicherzustellen, vDSO aktiv ist:Linux-vdso.so.1 => (0x00007ffcee25d000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6f6e161000) /lib64/ld-linux-x86-64.so.2 (0x0000559ed71f3000)
getauxval(AT_SYSINFO_EHDR) != NULL
ersetzt
gettimeofday(&tv, NULL)
Anrufe mitsyscall(SYS_gettimeofday, &tv, NULL)
, bis 10 Anzahl der Anrufe erhöht Millionen, lief untertime
- Laufzeitverhalten war das gleiche in beiden Fällen:./testgtod 0.16s user 0.83s system 99% cpu 0.998 total
.