J'ai besoin de profiler les performances d'une application pour laquelle j'utilise strace. Cependant, je ne sais pas vraiment comment interpréter les différents appels système émis par la strace. 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 vraiment en termes d'E/S, de données transférées, d'importance sur les performances, etc.
J'ai parcouru les pages de manuel de Strace mais je ne suis toujours pas très confiant. Si vous avez d'autres indications à lire, ce serait formidable.
J'ai une certaine expérience des systèmes d'exploitation et je comprends ce que sont les appels système, la mémoire, la mémoire virtuelle, la planification, etc.
Pour les comprendre, vous devez vous familiariser avec les appels système POSIX. Ils sont l'interface qu'un programme d'espace utilisateur 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.
En bref, lseek
déplace le pointeur interne du descripteur de fichier fourni vers l'octet avec la position pointée par le deuxième argument, à partir de SEEK_SET
(le début), SEEK_CUR
(position actuelle) ou SEEK_END
(la fin). Tout appel consécutif read
et write
sur le même descripteur commencera son action à partir de cette position. 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 un socket ou un tube.
write
copie le tampon fourni dans kernelspace et retourne le nombre d'octets réellement écrits. Selon le type de descripteur, le noyau peut écrire les données sur le disque ou les envoyer via le réseau. Il s'agit généralement d'une opération coûteuse car elle implique le transfert de ce tampon vers le noyau.
close
ferme le descripteur fourni et toutes les ressources associées avec lui dans le noyau sont libérées. Notez que chaque processus a une limite sur le nombre de descripteurs ouverts simultanément, 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'usage général est cependant d'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 pédale mmap
'.
fstat
renvoie diverses informations que le système de fichiers conserve sur un fichier - taille, dernière modification, autorisations, 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 ex. man lseek
(vérifiez également apropos
). Ils ont également une description des paramètres passés.
Voici de courts résumés:
lseek
- repositionner l'offset de fichier en lecture/écriture du descripteur de fichierwrite
- écrit dans un descripteur de fichier depuis le tamponclose
- supprime un descripteur de la table de référence d'objet par processusmmap
- alloue de la mémoire ou mappe des fichiers ou des périphériques en mémoiremunmap
- supprime un mappage pour la plage d'adresses spécifiéefstat
- récupère l'état du fichier pointé par le cheminVeuillez noter que l'interprétation de syscals simples/aléatoires ne sera pas significative en termes de performances. Pour tester la signification des performances de ces appels système, vous devez utiliser -c
paramètre qui peut compter le temps, les appels et les erreurs pour chaque appel système et rapporter le résumé. Ensuite, vous pouvez en savoir plus sur ceux qui prennent le plus de temps.
Pour en savoir plus sur la sortie et les paramètres strace
, vérifiez man strace
.
Voir aussi: Comment analyser strace dans Shell en texte brut?