How to identify disk abusing process?

Chris Ball cjb at mrao.cam.ac.uk
Fri Aug 11 20:25:01 EDT 2006


Bob,

   > So here is a Linux question that's been nagging at me.  Is there a
   > simple (command line) way of identifying processes that are
   > creating heavy disk i/o?  I suppose I could wrap some shell script
   > around sar, or poke around in /proc, but thought asking here might
   > be more productive and fun.  Any thoughts?

This sort of thing is a fun use of systemtap, which is the Linux
equivalent of Sun's dtrace.  Here's a quick script to count calls
to vfs_{read,write} made via each process:

unity:cjb~ % cat listio.stap
global execnames

probe kernel.function("vfs_write"), kernel.function("vfs_read") {
        execnames[execname()]++
}

# print top processnames every 5 seconds
probe timer.ms(5000) {
        foreach ([name] in execnames-) {
                # putting the - after execnames means sort descending
                printf("proc: %s, count: %d\n", name, execnames[name])
        }
        delete execnames
}

unity:cjb~ % sudo stap listio.stap
proc: Xorg, count: 896
proc: kiba-dock, count: 250
proc: compiz, count: 184
proc: gnome-terminal, count: 124
proc: gai-temp, count: 81
proc: cpufreq-applet, count: 76
proc: gnome-power-man, count: 60
proc: mixer_applet2, count: 50
proc: ssh, count: 50
[..]

   > A secondary, less important, question is how to identify the
   > file(s) being accessed.

Something like:

unity:cjb~ % cat whichfiles.stap
probe kernel.function("sys_open") {
  if ($flags & 1) {
    print(execname() . " writes " . user_string($filename) . "\n")
  } else {
    print(execname() . " reads " . user_string($filename) . "\n")
  }
} 

unity:cjb~ % sudo stap whichfiles.stap
hald-addon-stor reads /dev/hdc
cpufreq-applet reads /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
cpufreq-applet reads /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
cpufreq-applet reads /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cpufreq-applet reads /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
cpufreq-applet reads /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cpufreq-applet reads /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
sendmail reads /proc/loadavg
gai-temp reads /proc/acpi/thermal_zone/THRM/temperature
gai-temp reads /sys/devices/platform
NetworkManager reads /sys/class/net/eth0/carrier
[..]

I blogged about another use of systemtap a few months ago:

   http://blog.printf.net/articles/2006/05/11/systemtap-for-fun-and-profit

- Chris.
-- 
Chris Ball   <cjb at mrao.cam.ac.uk>    <http://blog.printf.net/>




More information about the Discuss mailing list