Submit
Path:
~
/
/
usr
/
share
/
doc
/
sysstat
/
examples
/
File Content:
sargraph
#!/bin/bash # sargraph - a simple sketch on how to generate graphs from sadf XML output # by Lans.Carstensen@dreamworks.com <Lans Carstensen> # Our dependencies - bail out if they are not found set -e ZENITY=`which zenity` XSLTPROC=`which xsltproc` SADF=`which sadf` GNUPLOT=`which gnuplot` MKTEMP=`which mktemp` FIND=`which find` SORT=`which sort` CUT=`which cut` GZIP=`which gzip` set +e # Default for --sa-dir SA_DIR="/var/log/sysstat" SA_REGEX='/sa[0-9][0-9]+(\.(gz|bz2|xz|lz|lzo))?$' ######### OPTION PARSING ########### set -e parsed_opts=`getopt -o "" -l sa-dir: -- "$@"` eval set -- "$parsed_opts" DONE=no while [ $DONE != yes ] do case $1 in --sa-dir) shift SA_DIR="$1" ;; --) # End of options DONE=yes ;; *) echo Unexpected argument: $1 exit 1 ;; esac shift # should shift the last arg or '--' if DONE=yes done set +e #################################### # sar / sysstat DTD is published here: # http://pagesperso-orange.fr/sebastien.godard/sysstat.dtd # compare against output of "sadf -x" # and pull apart data into gnuplot tabular data files # Subroutines # Graph for "sar -u" cpu_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -u" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./cpu-load/cpu[@number='all']/@user"/> <xsl:text> </xsl:text> <xsl:value-of select="./cpu-load/cpu[@number='all']/@nice"/> <xsl:text> </xsl:text> <xsl:value-of select="./cpu-load/cpu[@number='all']/@system"/> <xsl:text> </xsl:text> <xsl:value-of select="./cpu-load/cpu[@number='all']/@iowait"/> <xsl:text> </xsl:text> <xsl:value-of select="./cpu-load/cpu[@number='all']/@steal"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } cpu_gnuplot() { # Create the GNUplot rendering file, largely based on "isag" Tk script from sysstat package #set yrange [0:100] cat > $1 <<EOF set term x11 set title "sar -u" set ylabel "Percent" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "%user" with line, "$2" using 1:3 t "%nice" with line, "$2" using 1:4 t "%system" with line, "$2" using 1:5 t "%iowait" with line, "$2" using 1:6 t "%steal" with line pause mouse EOF } # To output to a file change the gnuplot routines to say something like: # set term svg # ... # set output "/tmp/test.svg" # plot ... # Graph for "sar -q" rq_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -q" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@runq-sz"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@plist-sz"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@ldavg-1"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@ldavg-5"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@ldavg-15"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } rq_gnuplot() { cat > $1 <<EOF set term x11 set title "sar -q" set ylabel "" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "runq-sz" with line, "$2" using 1:3 t "plist-sz" with line, "$2" using 1:4 t "ldavg-1" with line, "$2" using 1:5 t "ldavg-5" with line, "$2" using 1:6 t "ldavg-15" with line pause mouse EOF } # Graph for "sar -q", but w/o the process list size rqnoplistsz_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -q" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@runq-sz"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@ldavg-1"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@ldavg-5"/> <xsl:text> </xsl:text> <xsl:value-of select="./queue/@ldavg-15"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } rqnoplistsz_gnuplot() { cat > $1 <<EOF set term x11 set title "sar -q" set ylabel "" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "runq-sz" with line, "$2" using 1:3 t "ldavg-1" with line, "$2" using 1:4 t "ldavg-5" with line, "$2" using 1:5 t "ldavg-15" with line pause mouse EOF } # Graph for "sar -b" io_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -b" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./io/tps"/> <xsl:text> </xsl:text> <xsl:value-of select="./io/io-reads/@rtps"/> <xsl:text> </xsl:text> <xsl:value-of select="./io/io-writes/@wtps"/> <xsl:text> </xsl:text> <xsl:value-of select="./io/io-reads/@bread"/> <xsl:text> </xsl:text> <xsl:value-of select="./io/io-writes/@bwrtn"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } io_gnuplot() { cat > $1 <<EOF set term x11 set title "sar -b" set ylabel "ops/s" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "rtps" with line, "$2" using 1:3 t "wtps" with line, "$2" using 1:4 t "bread/s" with line, "$2" using 1:5 t "bwrtn/s" with line pause mouse EOF } # Graph for "sar -n NFS" nfsclient_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -n NFS" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./network/net-nfs/@call"/> <xsl:text> </xsl:text> <xsl:value-of select="./network/net-nfs/@retrans"/> <xsl:text> </xsl:text> <xsl:value-of select="./network/net-nfs/@read"/> <xsl:text> </xsl:text> <xsl:value-of select="./network/net-nfs/@write"/> <xsl:text> </xsl:text> <xsl:value-of select="./network/net-nfs/@access"/> <xsl:text> </xsl:text> <xsl:value-of select="./network/net-nfs/@getatt"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } nfsclient_gnuplot() { cat > $1 <<EOF set term x11 set title "sar -n NFS" set ylabel "ops/s" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "call/s" with line, "$2" using 1:3 t "retrans/s" with line, "$2" using 1:4 t "read/s" with line, "$2" using 1:5 t "write/s" with line, "$2" using 1:6 t "access/s" with line, "$2" using 1:7 t "getatt/s" with line pause mouse EOF } # Graph for "sar -B" paging_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -B" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./paging/@pgpgin"/> <xsl:text> </xsl:text> <xsl:value-of select="./paging/@pgpgout"/> <xsl:text> </xsl:text> <xsl:value-of select="./paging/@fault"/> <xsl:text> </xsl:text> <xsl:value-of select="./paging/@majflt"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } paging_gnuplot() { cat > $1 <<EOF set term x11 set title "sar -B" set ylabel "pages/s" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "pgpgin/s" with line, "$2" using 1:3 t "pgpgout/s" with line, "$2" using 1:4 t "fault/s" with line, "$2" using 1:5 t "majflt/s" with line pause mouse EOF } # Graph for "sar -r" memuse_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -r" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/memfree"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/memused"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/buffers"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/cached"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/swpfree"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/swpused"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/swpcad"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } memuse_gnuplot() { cat > $1 <<EOF set term x11 set title "sar -r" set ylabel "kB" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "kbmemfree" with line, "$2" using 1:3 t "kbmemused" with line, "$2" using 1:4 t "kbbuffers" with line, "$2" using 1:5 t "kbcached" with line, "$2" using 1:6 t "swpfree" with line, "$2" using 1:7 t "swpused" with line, "$2" using 1:8 t "swpcad" with line pause mouse EOF } # Graph for "sar -S" swapuse_xslt() { # Create the XSLT transform to make a GNUplot data file out of "sar -r" type data # test with "sadf -x | xsltproc <file containing stuff below> - cat > $1 <<EOF <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="/sysstat/host/statistics"> <xsl:text> </xsl:text> <xsl:for-each select="timestamp"> <xsl:value-of select="@time"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/swpfree"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/swpused"/> <xsl:text> </xsl:text> <xsl:value-of select="./memory/swpcad"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> EOF } swapuse_gnuplot() { cat > $1 <<EOF set term x11 set title "sar -S" set ylabel "kB" set timefmt "%H:%M:%S" set xdata time set format x "%H:%M" plot "$2" using 1:2 t "swpfree" with line, "$2" using 1:3 t "swpused" with line, "$2" using 1:4 t "swpcad" with line pause mouse EOF } SA_FILES=`$FIND "$SA_DIR" -type f -printf '%T@,%p\n' \ | egrep "$SA_REGEX" | $SORT -n -r | $CUT -d, -f2` # Main loop DONE=no while [ $DONE != yes ] do # Prompt for sa file SA_FILE=`$ZENITY --list --text "Select data source" \ --column "sa file" $SA_FILES` if [ "$SA_FILE" == "" ] then exit fi if echo $SA_FILE | grep '.gz$' then UNCOMPRESSED_SA_FILE=`mktemp` gzip -dc $SA_FILE > $UNCOMPRESSED_SA_FILE SA_FILE=$UNCOMPRESSED_SA_FILE fi # Prompt for graph GRAPH=`$ZENITY --list --text "Select a graph" --column "Graph Type" "CPU" "Run Queue" "Run Queue w/o Process List Size" "IO Transfer Rate" "NFS Client" "Paging Stats" "Memory Utilization" "Memory Utilization (Swap)"` case "$GRAPH" in "CPU") XSLTFILE=`mktemp` cpu_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -u | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` cpu_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; "Run Queue") XSLTFILE=`mktemp` rq_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -q | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` rq_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; "Run Queue w/o Process List Size") XSLTFILE=`mktemp` rqnoplistsz_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -q | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` rqnoplistsz_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; "IO Transfer Rate") XSLTFILE=`mktemp` io_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -b | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` io_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; "NFS Client") XSLTFILE=`mktemp` nfsclient_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -n NFS | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` nfsclient_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; "Paging Stats") XSLTFILE=`mktemp` paging_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -B | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` paging_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; "Memory Utilization") XSLTFILE=`mktemp` memuse_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -r | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` memuse_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; "Memory Utilization (Swap)") XSLTFILE=`mktemp` swapuse_xslt $XSLTFILE DATAFILE=`mktemp` $SADF -t -x $SA_FILE -- -S | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE GNUPLOTFILE=`mktemp` swapuse_gnuplot $GNUPLOTFILE $DATAFILE $GNUPLOT $GNUPLOTFILE ;; *) # If you click "Cancel", you end up here DONE=yes ;; esac [ -f "$UNCOMPRESSED_SA_FILE" ] && rm $UNCOMPRESSED_SA_FILE [ -f "$GNUPLOTFILE" ] && rm $GNUPLOTFILE [ -f "$DATAFILE" ] && rm $DATAFILE [ -f "$XSLTFILE" ] && rm $XSLTFILE done exit # Local Variables: # sh-basic-offset: 4 # indent-tabs-mode: nil # sh-indent-for-case-label: 0 # sh-indent-for-case-alt: + # End:
Edit
Rename
Chmod
Delete
FILE
FOLDER
Name
Size
Permission
Action
README.irqstat
164 bytes
0644
crontab
532 bytes
0644
irqstat
9656 bytes
0755
irqtop
11803 bytes
0755
sargraph
15024 bytes
0755
sargraph2
7607 bytes
0755
N4ST4R_ID | Naxtarrr