web-dev-qa-db-fra.com

Comment interpréter la sortie strace?

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.

28
mkc

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.

22

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 fichier
  • write - écrit dans un descripteur de fichier depuis le tampon
  • close - supprime un descripteur de la table de référence d'objet par processus
  • mmap - alloue de la mémoire ou mappe des fichiers ou des périphériques en mémoire
  • munmap - supprime un mappage pour la plage d'adresses spécifiée
  • fstat - récupère 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 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?

3
kenorb