Comment interpréter la sortie strace?
je dois profiler la performance d'une application pour laquelle j'utilise strace. Cependant, je ne sais pas vraiment comment interpréter les différents appels de système que la strace émet. En voici quelques exemples:
(A) lseek(3, 1600, SEEK_SET) = 1600
(B) write(3, "G_DATA 300 0 "..., 800) = 800
(C) close(3) = 0
(D) mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b600b179000
(E) munmap(0x2b600b179000, 4096) = 0
(F) fstat(3, {st_mode=S_IFREG|0644, st_size=1600, ...}) = 0
je vous serais reconnaissant de bien vouloir expliquer brièvement en anglais ce que ces lignes de (A) à (F) signifient réellement en termes d'E/S, de données transférées, d'importance sur la performance, etc.
j'ai traversé la man pages de strace mais je ne suis toujours pas très confiant. Si vous d'autres conseils pour moi de lire, ce serait génial.
j'ai de l'expérience sur les systèmes D'exploitation et je comprends quels sont les appels système, la mémoire, la mémoire virtuelle, la planification, etc. être.
2 réponses
pour les comprendre, vous devez vous familiariser avec les appels système POSIX. Ils sont l'interface qu'un programme utilisateur-Espace utilise pour interagir avec le noyau.
lseek
, write
, close
, mmap
, munmap
et fstat
sont tous appels système et sont documentés dans la section 2 du manuel linux.
brièvement, lseek
déplace le pointeur interne de la descripteur de fichier à l'octet avec position pointée par le second argument, à partir de SEEK_SET
(le début), SEEK_CUR
(la position actuelle) ou SEEK_END
(la fin). Tout appel consécutif read
et write
sur le même descripteur commencera son action à partir de ce poste. Notez que lseek
n'est pas implémenté pour tous les types de descripteurs - cela a du sens pour un fichier sur disque, mais pas pour une socket ou un pipe.
write
copies le tampon à kernelspace et renvoie le nombre d'octets effectivement écrits. Selon le type du descripteur, le noyau peut écrire les données sur le disque ou l'envoyer à travers le réseau. Cette opération est généralement coûteuse car elle implique le transfert de ce tampon au noyau.
close
ferme le descripteur fourni et toutes les ressources associées avec celui-ci dans le noyau sont libérées. Notez que chaque processus a une limite sur le nombre d'simultanément ouvrez les descripteurs, il est donc parfois nécessaire de fermer les descripteurs pour ne pas atteindre cette limite.
mmap
est un appel système complexe et est utilisé à de nombreuses fins, y compris la mémoire partagée. L'utilisation générale est cependant à allouer plus de mémoire pour le processus. Les fonctions de bibliothèque malloc
et calloc
l'utilisent généralement en interne.
munmap
libère la mémoire mmap
'ped.
fstat
renvoie diverses informations que le système de fichiers conserve sur la taille d'un fichier, les dernières modifications, les permissions, etc.
pour chaque commande il y a une page de manuel, vous pouvez la lire en tapant man
et le nom de la fonction C, par exemple man lseek
(cochez également apropos
). Ils ont également une description des paramètres passés.
voici de brefs résumés:
-
lseek
- reposition lecture / écriture offset de fichier du descripteur de fichier -
write
- Ecrire à un descripteur de fichier à partir du tampon -
close
- supprimer un descripteur du tableau de référence de l'objet par procédé -
mmap
- attribuer de la mémoire, ou mapper des fichiers ou des dispositifs dans la mémoire -
munmap
- supprimer une correspondance pour la plage d'adresses spécifiée -
fstat
- obtenir l'état du fichier pointé par le chemin
veuillez noter que l'interprétation de syscals simples/aléatoires ne sera pas significative en termes de performance. Pour tester la signification sur la performance de ces appels syscall, vous devez utiliser le paramètre -c
qui peut compter le temps, les appels et les erreurs pour chaque appel syscall et rapporter le résumé. Ensuite, vous pouvez en savoir plus sur ces qui prennent le plus de temps.
pour en savoir plus sur les paramètres de sortie et strace
, Vérifiez man strace
.