#!/bin/rc # # why - "why is this machine so slow" # usage: why [sampletime] t=1 if(! ~ $#* 0) t = $1 { cd /proc for(i in [0-9]*){ cat $i/status && echo $i } echo sleep $t for(i in [0-9]*){ cat $i/status && echo $i } } | awk ' phase == 0 && /./ { t0[$13] = $4+$5+$7+$8; rt0[$13] = $6 next } phase == 0 && /^$/ { phase = 1; next } phase != 0 { t1[$13] = $4+$5+$7+$8 rt1[$13] = $6 line[$13] = $0 } END { for(i in line){ n = split(line[i], p, " "); dt = ((t1[i] - t0[i] + 0.0) / (rt1[i] - rt0[i])) * 100 utime = (p[4]+p[4]+p[7]+p[8]) / 1000; size = p[9]; if(dt >= 1 || utime >= 1){ printf("%-10s %8s %3d%% %4d.%.2d %7dK %-8.8s %s\n", p[2], i, dt, utime/60, utime%60, size, p[3], p[1]); } } }' | sort +2rn -3rn +3rn | sed 's/(^[^ ]+ +[0-9]+ +[0-9]+% +[0-9]+)\./\1:/'