Ich leite die Ausgabe eines Programms in ein Perl, das ich geschrieben habe. Dies ist ein langwieriger Prozess, manchmal Tage, daher möchte ich herausfinden, wo meine Engpässe liegen, und versuchen, sie zu öffnen. Ich möchte wissen, ob Daten schneller in mein Skript geleitet werden, als mein Skript sie verarbeiten kann. In diesem Fall werde ich versuchen, mein Skript zu optimieren, aber nicht, wenn ich es nicht muss. Ich sehe die Rede davon, dass ein Flag gesetzt wird, wenn der Puffer voll ist, wodurch weitere Schreibvorgänge verhindert werden. Wie kann ich jedoch überprüfen, ob oder wie oft dieses Flag gesetzt ist? Irgendwelche Ideen?
11
pv
irgendwo entlang der Rohrkette zu verwenden.Antworten:
Ich würde Ihr Perl-Skript mit einem Systemaufruf-Trace-Tool verfolgen:
strace
(Linux),dtruss
(OS X),ktrace
(FreeBSD),truss
(Solaris) usw. Das Ziel wäre zu sehen, wie viel Zeit Ihr Perl-Skript damit verbringt, darauf zu warten, es zu lesen stdin und wie viel Zeit das andere Programm damit verbringt, darauf zu warten, in sein stdout zu schreiben.Hier teste ich dies mit dem Autor als Engpass:
Die erste Zahl ist hier die Zeit seit dem Start des vorherigen Systemaufrufs, und die letzte Zahl ist die Zeit, die im Systemaufruf verbracht wurde. Also können wir mit Perl ein bisschen nachbearbeiten, um es zu aggregieren ... [*]
Sie könnten schicker werden und ein SystemTap- oder DTrace-Skript erstellen, das beide Seiten gleichzeitig verfolgt, nur den richtigen Dateideskriptor verfolgt und jede Sekunde oder so eine nette Statusaktualisierung druckt, mit wie viel Prozent der Zeit jeder auf den anderen gewartet hat.
[*] - Warnung: Meine grobe Aggregation ist nicht ganz richtig, wenn Lese- / Schreibvorgänge für andere Dateideskriptoren aufgerufen werden. In diesem Fall wird die Arbeitszeit unterschätzt.
Die dtrace-Version ist eigentlich ziemlich ordentlich.
Und die SystemTap-Version:
quelle
Sie können einen
pv -TC
Befehl in Ihre Pipeline einfügen :pv
verwendet einen eigenen Puffer und-T
gibt an, wie voll er durchschnittlich in 1-Sekunden-Perioden ist (standardmäßig).Wenn es immer 100% ist, bedeutet dies, dass die
cmd1
Produktion schneller produziert alscmd2
verbraucht wird. Wenn nicht, dann ist es umgekehrt. Beachten Sie, dass die Rohre selbst 64 KB aufnehmen können.Siehe auch
-B
, umpv
die Puffergröße anzugeben . Sie können mehrerepv
s wie folgt verwenden:quelle