summaryrefslogtreecommitdiffstats
path: root/bin/iostats
diff options
context:
space:
mode:
Diffstat (limited to 'bin/iostats')
-rwxr-xr-xbin/iostats40
1 files changed, 40 insertions, 0 deletions
diff --git a/bin/iostats b/bin/iostats
new file mode 100755
index 0000000..924c273
--- /dev/null
+++ b/bin/iostats
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+# Usage: pipe the output of Linux's `strace' program into the stdin of
+# this command, and the output of this command into gnuplot.
+
+$filename = shift || "tstab2.h5";
+$total = 0;
+
+while (<>) {
+ if (!defined $fd) {
+ if (/^open\("(.*?)".*=\s+(\d+)/ && $1 eq $filename) {
+ $fd = $2;
+ $pos = 0;
+ }
+ } elsif (/^close\((\d+)/ && $1==$fd) {
+ $fd = undef;
+ } elsif (/^lseek\((\d+), -?\d+,.*= (\d+)/ &&
+ $1==$fd && $2>=0) {
+ $pos = $2;
+ } elsif (/^lseek\((\d+),/ && $1==$fd) {
+ die $_;
+ } elsif (/^write\((\d+), ".*?"(\.\.\.)?, \d+\)\s*= (\d+)/ &&
+ $1==$fd && $3>=0) {
+ my $nbytes = $3;
+ printf "%d %d\n", $total, $pos;
+ $pos += $nbytes;
+ $total += $nbytes;
+ } elsif (/^write\((\d+),/ && $1==$fd) {
+ die $_;
+ } elsif (/^read\((\d+), ".*?"(\.\.\.)?, \d+\)\s*= (\d+)/ &&
+ $1==$fd && $3>=0) {
+ my $nbytes = $3;
+ printf "%d %d\n", $total, $pos;
+ $pos += $nbytes;
+ $total += $nbytes;
+ } elsif (/^read\((\d+),/ && $1==$fd) {
+ die $_;
+ }
+}
+