Comment tracer par-fichier d'opérations d'e / s dans Linux?
J'ai besoin de suivre read
appels système de fichiers spécifiques, et je suis actuellement en train de faire cela par l'analyse de la sortie de strace
. Depuis read
fonctionne sur les descripteurs de fichier je dois garder une trace de la cartographie des courants entre fd
et path
. En outre, seek
doit être surveillé afin de conserver la position actuelle jusqu'à la date de la trace.
Est-il une meilleure façon d'obtenir par application, par-file-path IO traces dans Linux?
OriginalL'auteur Noah Watkins | 2012-03-08
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'avez probablement pas besoin de garder une trace comme le mappage entre
fd
etpath
est disponible dans/proc/PID/fd/
.Deuxième, peut-être que vous devriez utiliser le LD_PRELOAD astuce et de la surcharge en C
open
,seek
etread
appel système. Il y a quelques article ici et il y sur la façon de surcharge de malloc/free.Je suppose que ce ne sera pas trop différent d'appliquer le même genre de truc pour ces appels système. Il doit être implémenté en C, mais il devrait beaucoup moins de code et d'être plus précis que l'analyse
strace
de sortie.OriginalL'auteur Coren
Vous pourriez attendre que les fichiers soient ouverts afin que vous puissiez apprendre le fd et le joindre strace après le processus de lancement comme ceci:
OriginalL'auteur user1055604
systemtap - une sorte de DTrace des émules pour Linux - pourrait être de l'aide ici.
Comme avec strace vous n'avez que la fd, mais avec le script capacité, il est facile de maintenir le nom de fichier pour un fd (sauf avec des choses amusantes comme dup). Il y a l'exemple de script iotime que illustates.
Il ne fonctionne que jusqu'à un certain nombre de fichiers, car le hachage de la carte est de taille limitée.
OriginalL'auteur dmeister
Je pense que la surcharge
open
,seek
etread
est une bonne solution. Mais juste pour info si vous voulez analyser et d'analyser les strace sortie de la programmation, j'ai fait quelque chose de semblable avant et de mettre mon code sur github: https://github.com/johnlcf/Stana/wiki(Je l'ai fait parce que je dois analyser le strace résultat de ce programme, dirigé par d'autres, ce qui n'est pas facile de leur demander de faire LD_PRELOAD.)
OriginalL'auteur Johnlcf
Probablement le moins pire méthode pour ce faire est d'utiliser fanotify. Fanotify est un noyau Linux qui permet à moindre coût à regarder des événements du système de fichiers. Je ne suis pas sûr si elle permet de filtrer par PID, mais il passe le PID de votre programme de sorte que vous pouvez vérifier si c'est celui qui vous intéresse.
Voici un bel exemple de code:
http://bazaar.launchpad.net/~pitti/fatrace/trunk/view/tête:/fatrace.c
Cependant, il semble être sous-documenté à l'heure actuelle. Tous les docs que j'ai pu trouver sont http://www.spinics.net/lists/linux-man/msg02302.html et http://lkml.indiana.edu/hypermail/linux/kernel/0811.1/01668.html
OriginalL'auteur Shnatsel
L'analyse de la ligne de commande utils comme strace est lourd; vous pourriez utiliser ptrace() syscall à la place. Voir
man ptrace
pour plus de détails.OriginalL'auteur Shnatsel