From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <182d0fe6c1a48fc89b095d00ccfcfb07@cat-v.org> To: 9fans@cse.psu.edu Subject: Re: [9fans] Re: patch/list sorry/proc-mtime Date: Thu, 30 Mar 2006 19:32:30 +0200 From: uriel@cat-v.org In-Reply-To: <1de2c7c96eb8168c5d4c800fb3dba008@vitanuova.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Topicbox-Message-UUID: 275d775c-ead1-11e9-9d60-3106f5b1d025 There is also /n/sources/contrib/uriel/scripts/atop, a graphical top in C by 20h and a version by f2f in perl, the existence of the perl version pissed me off so much that I had to rewrite it in awk and IIRC halve the line count in the process. We all love to duplicate work. Anyway, it is usually a good idea to dig around the [contrib index] wiki page, often one finds useful things. I'm still wondering why g " and "' are not part of the standard distribution. uriel > i was about to say that i'd find it useful if the atime of /proc/n > reflected the last run time of a process, to make it easier to find > cpu hogs, but russ's point about ls -lt /proc's uselessness is bang > on. > > so, by way of a little script to help with the above problem, which > bugs me every so often, here's "hogs", a poor man's replacement for > unix's "top" - it's like ps except that it sorts the processes by the > amount of time they've used over the last t (default 1) seconds. > > it displays percentage of time used over the sample time (this might > be >100% with multiple cpus), and combines user, syscall and child > time into the second time column (to make it easier to find processes > that spawn lots of transient cpu-eating processes but don't do much > themselves); otherwise the output format is the same as for ps(1). > > YMMV - i imagine others have similar scripts. > > cat >$home/bin/rc/hogs <<'EOF' > #!/bin/rc > # usage: hogs [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:/' > EOF