Je redirige la sortie d'un programme vers un Perl que j'ai écrit. C'est un processus long, parfois des jours, donc je veux savoir où sont mes goulots d'étranglement et essayer de les ouvrir. Je veux savoir si les données sont transférées dans mon script plus rapidement que mon script ne peut les traiter. Si c'est le cas, j'essaierai de peaufiner mon script, mais pas si je n'en ai pas besoin. Je vois parler d'un indicateur défini lorsque le tampon est plein, ce qui empêche d'autres écritures, mais comment puis-je vérifier si ou à quelle fréquence cet indicateur est défini? Des idées?
11
pv
quelque part le long de la chaîne de tuyaux.Réponses:
Je tracerais votre script Perl avec un outil de trace d'appel système:
strace
(Linux),dtruss
(OS X),ktrace
(FreeBSD),truss
(Solaris), etc. Le but serait de voir combien de temps votre script Perl passe à attendre la lecture de son stdin et combien de temps l'autre programme passe à attendre l'écriture sur sa sortie standard.Ici, je teste cela avec l'écrivain comme goulot d'étranglement:
Le premier nombre ici est le temps écoulé depuis le début du précédent appel système, et le dernier nombre est le temps passé dans l'appel système. Nous pouvons donc un peu post-traiter avec Perl pour l'agréger ... [*]
Vous pourriez devenir plus sophistiqué et créer un script SystemTap ou DTrace qui trace les deux côtés à la fois, ne suit que le descripteur de fichier correct et imprime une belle mise à jour de statut toutes les secondes environ avec quel pourcentage de temps chacun attendait l'autre.
[*] - Attention: mon agrégation grossière n'est pas tout à fait correcte si la lecture / écriture est appelée sur d'autres descripteurs de fichiers; il sous-estimera le temps de travail dans ce cas.
La version dtrace est plutôt soignée en fait.
Et la version SystemTap:
la source
Vous pouvez insérer une
pv -TC
commande dans votre pipeline:pv
utilise son propre tampon et lui-T
fait rapporter combien il est plein en moyenne sur des périodes de 1 seconde (par défaut).Si elle est toujours à 100%, cela signifie que la production
cmd1
est plus rapide que lacmd2
consommation. Sinon, c'est l'inverse. Attention, les tuyaux eux-mêmes peuvent contenir 64 Ko.Voir aussi
-B
pour spécifierpv
la taille du tampon. Vous pouvez utiliser plusieurspv
s comme dans:la source