From 5f27cb0c4fdb3442f5dc5e95dd6a1996df1da3de Mon Sep 17 00:00:00 2001 From: Philip Knirsch Date: Mon, 2 Feb 2009 12:59:41 +0100 Subject: - Added disk and net monitoring systemtap scripts --- contrib/diskdevstat.stp | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ contrib/netdevstat.stp | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100755 contrib/diskdevstat.stp create mode 100755 contrib/netdevstat.stp diff --git a/contrib/diskdevstat.stp b/contrib/diskdevstat.stp new file mode 100755 index 0000000..2c50b1d --- /dev/null +++ b/contrib/diskdevstat.stp @@ -0,0 +1,92 @@ +#!/usr/bin/stap +# +# diskdevstat: A simple systemtap script to record harddisk activity of processes and +# display statistics for read/write operations +# Copyright (C) 2008, 2009 Red Hat, Inc. +# Authors: Phil Knirsch +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# + +global ifavg, iflast, ifmin, ifmax; + +probe vfs.write +{ + if(pid() == 0 || devname == "N/A") { + next; + } + ns = gettimeofday_ms(); + if(iflast[0, pid(), devname, execname(), uid()] == 0) { + iflast[0, pid(), devname, execname(), uid()] = ns; + } else { + diff = ns - iflast[0, pid(), devname, execname(), uid()]; + iflast[0, pid(), devname, execname(), uid()] = ns; + if(ifmin[0, pid(), devname, execname(), uid()] == 0 || diff < ifmin[0, pid(), devname, execname(), uid()]) + ifmin[0, pid(), devname, execname(), uid()] = diff; + if(diff > ifmax[0, pid(), devname, execname(), uid()]) + ifmax[0, pid(), devname, execname(), uid()] = diff; + ifavg[0, pid(), devname, execname(), uid()] <<< diff; + } +} + +probe vfs.read +{ + if(pid() == 0 || devname == "N/A") { + next; + } + ns = gettimeofday_ms(); + if(iflast[1, pid(), devname, execname(), uid()] == 0) { + iflast[1, pid(), devname, execname(), uid()] = ns; + } else { + diff = ns - iflast[1, pid(), devname, execname(), uid()]; + iflast[1, pid(), devname, execname(), uid()] = ns; + if(ifmin[1, pid(), devname, execname(), uid()] == 0 || diff < ifmin[1, pid(), devname, execname(), uid()]) + ifmin[1, pid(), devname, execname(), uid()] = diff; + if(diff > ifmax[1, pid(), devname, execname(), uid()]) + ifmax[1, pid(), devname, execname(), uid()] = diff; + ifavg[1, pid(), devname, execname(), uid()] <<< diff; + } +} + + +function print_activity() +{ + printf("%5s %5s %-7s %9s %9s %9s %9s %9s %9s %9s %9s %-15s\n", + "PID", "UID", "DEV", "WRITE_CNT", "WRITE_MIN", "WRITE_MAX", "WRITE_AVG", "READ_CNT", "READ_MIN", "READ_MAX", "READ_AVG", "COMMAND") + + foreach ([type, pid, dev, exec, uid] in -ifavg) { + nxmit = @count(ifavg[0, pid, dev, exec, uid]) + nrecv = @count(ifavg[1, pid, dev, exec, uid]) + if(type == 0 || nxmit == 0) { + printf("%5d %5d %-7s %9d %5d.%03d %5d.%03d %5d.%03d %9d %5d.%03d %5d.%03d %5d.%03d %-15s\n", + pid, uid, dev, + nxmit, ifmin[0, pid, dev, exec, uid]/1000, ifmin[0, pid, dev, exec, uid]%1000, + ifmax[0, pid, dev, exec, uid]/1000, ifmax[0, pid, dev, exec, uid]%1000, + nxmit ? @avg(ifavg[0, pid, dev, exec, uid])/1000 : 0, nxmit ? @avg(ifavg[0, pid, dev, exec, uid])%1000 : 0, + nrecv, ifmin[1, pid, dev, exec, uid]/1000, ifmin[1, pid, dev, exec, uid]%1000, + ifmax[1, pid, dev, exec, uid]/1000, ifmax[1, pid, dev, exec, uid]%1000, + nrecv ? @avg(ifavg[1, pid, dev, exec, uid])/1000 : 0, nrecv ? @avg(ifavg[1, pid, dev, exec, uid])%1000 : 0, + exec) + } + } + + print("\n") +} + +probe timer.ms(5000), end, error +{ + print_activity() +} + diff --git a/contrib/netdevstat.stp b/contrib/netdevstat.stp new file mode 100755 index 0000000..cfe6e9a --- /dev/null +++ b/contrib/netdevstat.stp @@ -0,0 +1,92 @@ +#!/usr/bin/stap +# +# netdevstat: A simple systemtap script to record network activity of processes and +# display statistics for transmit/receive operations +# Copyright (C) 2008, 2009 Red Hat, Inc. +# Authors: Phil Knirsch +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# + +global ifavg, iflast, ifmin, ifmax; + +probe netdev.transmit +{ + if(pid() == 0) { + next; + } + ns = gettimeofday_ms(); + if(iflast[0, pid(), dev_name, execname(), uid()] == 0) { + iflast[0, pid(), dev_name, execname(), uid()] = ns; + } else { + diff = ns - iflast[0, pid(), dev_name, execname(), uid()]; + iflast[0, pid(), dev_name, execname(), uid()] = ns; + if(ifmin[0, pid(), dev_name, execname(), uid()] == 0 || diff < ifmin[0, pid(), dev_name, execname(), uid()]) + ifmin[0, pid(), dev_name, execname(), uid()] = diff; + if(diff > ifmax[0, pid(), dev_name, execname(), uid()]) + ifmax[0, pid(), dev_name, execname(), uid()] = diff; + ifavg[0, pid(), dev_name, execname(), uid()] <<< diff; + } +} + +probe netdev.receive +{ + if(pid() == 0) { + next; + } + ns = gettimeofday_ms(); + if(iflast[1, pid(), dev_name, execname(), uid()] == 0) { + iflast[1, pid(), dev_name, execname(), uid()] = ns; + } else { + diff = ns - iflast[1, pid(), dev_name, execname(), uid()]; + iflast[1, pid(), dev_name, execname(), uid()] = ns; + if(ifmin[1, pid(), dev_name, execname(), uid()] == 0 || diff < ifmin[1, pid(), dev_name, execname(), uid()]) + ifmin[1, pid(), dev_name, execname(), uid()] = diff; + if(diff > ifmax[1, pid(), dev_name, execname(), uid()]) + ifmax[1, pid(), dev_name, execname(), uid()] = diff; + ifavg[1, pid(), dev_name, execname(), uid()] <<< diff; + } +} + + +function print_activity() +{ + printf("%5s %5s %-7s %9s %9s %9s %9s %9s %9s %9s %9s %-15s\n", + "PID", "UID", "DEV", "XMIT_CNT", "XMIT_MIN", "XMIT_MAX", "XMIT_AVG", "RECV_CNT", "RECV_MIN", "RECV_MAX", "RECV_AVG", "COMMAND") + + foreach ([type, pid, dev, exec, uid] in ifavg-) { + nxmit = @count(ifavg[0, pid, dev, exec, uid]) + nrecv = @count(ifavg[1, pid, dev, exec, uid]) + if(type == 0 || nxmit == 0) { + printf("%5d %5d %-7s %9d %5d.%03d %5d.%03d %5d.%03d %9d %5d.%03d %5d.%03d %5d.%03d %-15s\n", + pid, uid, dev, + nxmit, ifmin[0, pid, dev, exec, uid]/1000, ifmin[0, pid, dev, exec, uid]%1000, + ifmax[0, pid, dev, exec, uid]/1000, ifmax[0, pid, dev, exec, uid]%1000, + nxmit ? @avg(ifavg[0, pid, dev, exec, uid])/1000 : 0, nxmit ? @avg(ifavg[0, pid, dev, exec, uid])%1000 : 0, + nrecv, ifmin[1, pid, dev, exec, uid]/1000, ifmin[1, pid, dev, exec, uid]%1000, + ifmax[1, pid, dev, exec, uid]/1000, ifmax[1, pid, dev, exec, uid]%1000, + nrecv ? @avg(ifavg[1, pid, dev, exec, uid])/1000 : 0, nrecv ? @avg(ifavg[1, pid, dev, exec, uid])%1000 : 0, + exec) + } + } + + print("\n") +} + +probe timer.ms(5000), end, error +{ + print_activity() +} + -- cgit