3421N/A#!/usr/bin/sh
3421N/A#
3421N/A# dvmstat - vmstat by PID/name/command.
3421N/A# Written using DTrace (Solaris 10 3/05).
3421N/A#
3421N/A# This program provides vmstat like data for one particular PID, a
3421N/A# process name, or when running a command. It prints statistics
3421N/A# every second.
3421N/A#
3421N/A# $Id: dvmstat 3 2007-08-01 10:50:08Z brendan $
3421N/A#
3421N/A# USAGE: dvmstat { -p PID | -n name | command }
3421N/A# eg,
3421N/A# dvmstat -p 1871 # examine PID 1871
3421N/A# dvmstat -n tar # examine processes called "tar"
3421N/A# dvmstat df -h # run and examine "df -h"
3421N/A#
3421N/A# FIELDS:
3421N/A# re page reclaims Kbytes
3421N/A# maj major faults Kbytes
3421N/A# mf minor faults Kbytes
3421N/A# fr page frees Kbytes
3421N/A# epi executable page ins Kbytes
3421N/A# epo executable page out Kbytes
3421N/A# api anonymous page ins Kbytes
3421N/A# apo anonymous page outs Kbytes
3421N/A# fpi filesystem page ins Kbytes
3421N/A# fpo filesystem page outs Kbytes
3421N/A# sy system calls number
3421N/A#
3421N/A# SEE ALSO: vmstat(1M)
3421N/A#
3421N/A# NOTES:
3421N/A#
3421N/A# When using dvmstat to run a command - if the command takes some time
3421N/A# to execute, dvmstat will print output every second. If the command runs
3421N/A# in less than a second, then the only one line of output will be printed.
3421N/A#
3421N/A# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
3421N/A#
3421N/A# CDDL HEADER START
3421N/A#
3421N/A# The contents of this file are subject to the terms of the
3421N/A# Common Development and Distribution License, Version 1.0 only
3421N/A# (the "License"). You may not use this file except in compliance
3421N/A# with the License.
3421N/A#
3421N/A# You can obtain a copy of the license at Docs/cddl1.txt
3421N/A# or http://www.opensolaris.org/os/licensing.
3421N/A# See the License for the specific language governing permissions
3421N/A# and limitations under the License.
3421N/A#
3421N/A# CDDL HEADER END
3421N/A#
3421N/A# Author: Brendan Gregg [Sydney, Australia]
3421N/A#
3421N/A# 12-Jun-2005 Brendan Gregg Created this.
3421N/A# 08-Jan-2006 " " Last update.
3421N/A#
3421N/A
3421N/A##############################
3421N/A# --- Process Arguments ---
3421N/A#
3421N/A
3421N/A### Default variables
3421N/Aopt_pid=0; opt_name=0; pid=0; pname="."; opt_command=0; command=""
3421N/A
3421N/A### Process options
3421N/Awhile getopts hn:p: name
3421N/Ado
3421N/A case $name in
3421N/A p) opt_pid=1; pid=$OPTARG ;;
3421N/A n) opt_name=1; pname=$OPTARG ;;
3421N/A h|?) cat <<-END >&2
3421N/A USAGE: dvmstat [-h] { -p PID | -n name | command }
3421N/A -p PID # examine this PID
3421N/A -n name # examine this process name
3421N/A eg,
3421N/A dvmstat -p 1871 # examine PID 1871
3421N/A dvmstat -n tar # examine processes called "tar"
3421N/A dvmstat df -h # run and examine "df -h"
3421N/A END
3421N/A exit 1
3421N/A esac
3421N/Adone
3421N/Ashift `expr $OPTIND - 1`
3421N/A
3421N/A
3421N/A### Option logic
3421N/Aif [ $opt_pid -eq 0 -a $opt_name -eq 0 ]; then
3421N/A opt_command=1
3421N/A if [ "$*" = "" ]; then
3421N/A $0 -h
3421N/A exit
3421N/A fi
3421N/A command="$*"
3421N/Afi
3421N/A
3421N/A
3421N/A#################################
3421N/A# --- Main Program, DTrace ---
3421N/A#
3421N/Adtrace='
3421N/A #pragma D option quiet
3421N/A
3421N/A /*
3421N/A * Command line arguments
3421N/A */
3421N/A inline int OPT_pid = '$opt_pid';
3421N/A inline int OPT_name = '$opt_name';
3421N/A inline int OPT_command = '$opt_command';
3421N/A inline int PID = '$pid';
3421N/A inline string NAME = "'$pname'";
3421N/A inline string COMMAND = "'$command'";
3421N/A inline int SCREEN = 21;
3421N/A
3421N/A /*
3421N/A * Initialise variables
3421N/A */
3421N/A dtrace:::BEGIN
3421N/A {
3421N/A epi = 0; epo = 0; api = 0; apo = 0; fpi = 0; fpo = 0;
3421N/A re = 0; mf = 0; maj = 0; fr = 0; sy = 0;
3421N/A lines = SCREEN + 1;
3421N/A header = 0;
3421N/A }
3421N/A
3421N/A /*
3421N/A * Print header
3421N/A */
3421N/A dtrace:::BEGIN,
3421N/A dtrace:::END,
3421N/A profile:::tick-1sec
3421N/A /(OPT_command && probename == "END") ||
3421N/A (!(OPT_command && probename == "BEGIN") && lines++ > SCREEN)/
3421N/A {
3421N/A printf("%6s %5s %5s %4s %4s %4s %4s %4s %4s %4s %6s\n",
3421N/A "re", "maj", "mf", "fr", "epi", "epo", "api", "apo",
3421N/A "fpi", "fpo", "sy");
3421N/A lines = 0;
3421N/A }
3421N/A
3421N/A /*
3421N/A * Probe events
3421N/A *
3421N/A * this intentionally does not use an associative array for storing data,
3421N/A * for reasons of performance.
3421N/A */
3421N/A
3421N/A vminfo:::execpgin
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { epi += arg0; }
3421N/A
3421N/A vminfo:::execpgout
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { epo += arg0; }
3421N/A
3421N/A vminfo:::anonpgin
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { api += arg0; }
3421N/A
3421N/A vminfo:::anonpgout
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { apo += arg0; }
3421N/A
3421N/A vminfo:::fspgin
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { fpi += arg0; }
3421N/A
3421N/A vminfo:::fspgout
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { fpo += arg0; }
3421N/A
3421N/A vminfo:::pgrec
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { re += arg0; }
3421N/A
3421N/A vminfo:::as_fault
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { mf += arg0; }
3421N/A
3421N/A vminfo:::maj_fault
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { maj += arg0; }
3421N/A
3421N/A vminfo:::dfree
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { fr += arg0; }
3421N/A
3421N/A syscall:::entry
3421N/A /(OPT_pid && pid == PID) ||
3421N/A (OPT_name && execname == NAME) ||
3421N/A (OPT_command && pid == $target)/
3421N/A { sy++; }
3421N/A
3421N/A /*
3421N/A * Print output line
3421N/A */
3421N/A profile:::tick-1sec,
3421N/A dtrace:::END
3421N/A {
3421N/A /* convert to Kbytes */
3421N/A re *= `_pagesize / 1024;
3421N/A maj *= `_pagesize / 1024;
3421N/A mf *= `_pagesize / 1024;
3421N/A fr *= `_pagesize / 1024;
3421N/A epi *= `_pagesize / 1024;
3421N/A epo *= `_pagesize / 1024;
3421N/A api *= `_pagesize / 1024;
3421N/A apo *= `_pagesize / 1024;
3421N/A fpi *= `_pagesize / 1024;
3421N/A fpo *= `_pagesize / 1024;
3421N/A
3421N/A /* print line */
3421N/A printf("%6d %5d %5d %4d %4d %4d %4d %4d %4d %4d %6d\n",
3421N/A re, maj, mf, fr, epi, epo, api, apo, fpi, fpo, sy);
3421N/A
3421N/A /* clear counters */
3421N/A epi = 0; epo = 0; api = 0; apo = 0; fpi = 0; fpo = 0;
3421N/A re = 0; mf = 0; maj = 0; fr = 0; sy = 0;
3421N/A }
3421N/A'
3421N/A
3421N/A### Run DTrace
3421N/Aif [ $opt_command -eq 1 ]; then
3421N/A /usr/sbin/dtrace -n "$dtrace" -x evaltime=exec -c "$command" >&2
3421N/Aelse
3421N/A /usr/sbin/dtrace -n "$dtrace" >&2
3421N/Afi
3421N/A
3421N/A