Outils
Aperçu
Linux propose une large palette d’outils pour la mesure de performances :
strace
strace
est un outil permettant de surveiller les appels système utilisés par une
application sous Linux
# strace -tt ./clock 1
01:43:36.802013 execve("./clock", ["./clock", "1"], 0xffffc8c547e0 /* 16 vars */) = 0
01:43:36.804217 brk(NULL) = 0x89f2000
01:43:36.804476 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffffb05d .
01:43:36.804795 faccessat(AT_FDCWD, "/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directo .
01:43:36.805084 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or .
01:43:36.805252 openat(AT_FDCWD, "/lib/tls/aarch64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No su .
01:43:36.805444 newfstatat(AT_FDCWD, "/lib/tls/aarch64", 0xfffff027b800, 0) = -1 ENOENT (No such fil ..
01:43:36.805662 openat(AT_FDCWD, "/lib/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file ..
01:43:36.805840 newfstatat(AT_FDCWD, "/lib/tls", 0xfffff027b800, 0) = -1 ENOENT (No such file or ...
01:43:36.805965 openat(AT_FDCWD, "/lib/aarch64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such ...
01:43:36.806093 newfstatat(AT_FDCWD, "/lib/aarch64", 0xfffff027b800, 0) = -1 ENOENT (No such file ...
01:43:36.806288 openat(AT_FDCWD, "/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
01:43:36.806450 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\350\365\1\0\0\0\0\0"..., ...
01:43:36.806634 fstat(3, {st_mode=S_IFREG|0755, st_size=1283888, ...}) = 0
01:43:36.806778 mmap(NULL, 1356392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff ...
01:43:36.806937 mprotect(0xffffb0591000, 61440, PROT_NONE) = 0
......
01:43:36.809857 write(1, "time=0'000'001 ns\n", 18time=0'000'001 ns
) = 18
01:43:36.810015 write(1, "292\n", 4292
) = 4
01:43:36.810183 exit_group(0) = ?
01:43:36.810781 +++ exited with 0 +++
#
Il est important de noter que strace influence énormément le comportement de l’application
strace
propose un grand choix d’options, ici une autre façon de mesurer le temps
# strace -c ./clock 100000
...
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 1.643296 16 100002 write
0.00 0.000000 0 1 ioctl
0.00 0.000000 0 1 1 faccessat
0.00 0.000000 0 5 4 openat
0.00 0.000000 0 1 close
0.00 0.000000 0 1 read
0.00 0.000000 0 3 3 newfstatat
0.00 0.000000 0 2 fstat
0.00 0.000000 0 1 sched_setaffinity
0.00 0.000000 0 3 brk
0.00 0.000000 0 1 execve
0.00 0.000000 0 4 mmap
0.00 0.000000 0 4 mprotect
------ ----------- ----------- --------- --------- ----------------
100.00 1.643296 100029 8 total
ltrace
ltrace
est un outil permettant de surveiller les appels faits par une application à
des méthodes de bibliothèques partagées (shared libraries)
# ltrace -tt ./clock 1
00:04:31.538829 __libc_start_main([ "./clock", "1" ] <unfinished ...>
00:04:31.549903 sched_setaffinity(0, 128, 0xfffff2218f08, 0xfffff2218f08) = 0
00:04:31.550871 printf("clocks_per_sec=%ld\n", 1000000clocks_per_sec=1000000
) = 23
00:04:31.552707 atol(0xfffff2219e96, 0, 1, 0) = 1
00:04:31.553544 clock_getres(4, 0xfffff2218ef8, 10, 0xfffff2219e97) = 0
00:04:31.554208 printf("time=%ld'%03ld'%03ld ns\n", 0, 0, 1time=0'000'001 ns
) = 18
00:04:31.555774 clock_gettime(4, 0xfffff2218eb0, 1, 0) = 0
00:04:31.556448 clock_gettime(4, 0xfffff2218eb0, 0x20f342eff9be1b74, 0x20f3bd10726438f8) = 0
00:04:31.557182 clock_gettime(4, 0xfffff2218eb0, 0x20f342eff9be1b74, 0x20f3bd10726438f8) = 0
00:04:31.557924 clock_gettime(4, 0xfffff2218ea0, 0x20f342eff9be1b74, 0x20f3bd10726438f8) = 0
00:04:31.558599 printf("%lld\n", 678875678875
) = 7
00:04:31.560006 +++ exited (status 0) +++
Là également, il est important de noter que ltrace
influence passablement le
comportement de l’application
ltrace
propose aussi un grand choix d’options, ici une autre façon de mesurer
le temps
# ltrace -c ./clock 1000 > /dev/null
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
57.09 0.910034 910034 1 __libc_start_main
28.43 0.453122 226 2002 clock_gettime
14.40 0.229538 229 1002 printf
0.03 0.000452 452 1 exit_group
0.02 0.000384 384 1 sched_setaffinity
0.02 0.000245 245 1 atol
0.01 0.000238 238 1 clock_getres
------ ----------- ----------- --------- --------------------
100.00 1.594013 3009 total
ftrace
ftrace
est un outil pour l’analyse d’un système mettant en œuvre une
instrumentation au niveau noyau Linux
ftrace
permet de tracer à la µs les événements suivants :
- Appels système
- Fonctions de traitement d’interruptions
- Fonctions d’ordonnancement
- Piles de protocoles réseau
Une large documentation est disponible dans le noyau
- https://www.kernel.org/doc/Documentation/trace/ftrace.txt
- https://www.kernel.org/doc/Documentation/trace/events.txt
Avant d’utiliser ftrace
il faut préalablement configurer le noyau Linux
make linux-menuconfig
--> kernel-hacking
--> Tracers
--> Kernel Function Tracer
--> Trace syscalls
ftrace - Utilisation
L’utilisation de ftrace
passe par les étapes suivantes :
- Sélectionner un traceur indiquant la fonctionnalité à tracer dans le noyau
- Définir un filtre pour limiter les traces produites (exemple: le nom de la fonction à tracer)
- Activer la trace en effectuant la commande :
echo 1 > /proc/sys/kernel/ftrace_enabled
- Après enregistrement, désactiver la trace afin de limiter la taille des données par :
echo 0 > /proc/sys/kernel/ftrace_enabled
- Exploiter les résultats
L’utilisation de ftrace
nécessite d’activer la fonctionnalité debugfs
mount -t debugfs none /sys/kernel/debug
On dispose alors du répertoire /sys/kernel/debug/tracing
contenant
entre-autres le fichier trace qui contient les résultats de l’instrumentation.
Les autres principaux fichiers de ce répertoire sont donnés ci-après :
available_tracers
contient les différents traceurs disponibles, soitnop
,function
,function_graph
, …current_tracer
contient le traceur courant, donc une valeur de la liste précédentetracing_on
permet d’activer/désactiver les traces en écrivant les valeurs1
ou0
available_events
contient les évènements traçables commesched_wakeup
. Ces évènements correspondent à des points de trace (ou Tracepoints) statiques ajoutés au noyau Linux, voirDocumentation/trace/events.txt
set_ftrace_pid
permet de tracer un processus donné par son PID
OProfile
OProfile est également un outil de profilage de code sous Linux avec une très faible empreinte :
- Il permet de profiler aussi bien un système complet qu’un sous ensemble, par exemple les routines d’interruption, les pilotes de périphériques ou un processus
- Pour effectuer l’instrumentation du système, il utilise les horloges système
- Il est également capable d’utiliser les compteurs matériels si le processeur en disposant
Avec perf
, OProfile
est probablement un des outils de monitoring les plus
utilisés sous Linux
La documentation est disponible sur http://oprofile.sourceforge.net