sar.sh

133 lines | 4.426 kB Blame History Raw Download
#!/bin/bash

cd "$(dirname "$0")"
. ./common.sh

SAR_OPERATION=${SAR_OPERATION:-stop}

SAR_FOLDER="$PROJECT_BUILD_DIRECTORY/sar"
PID_FILE="$SAR_FOLDER/sar.pid"
TIMESTAMP_FILE="$SAR_FOLDER/sar.timestamp"
if [[ -f "$TIMESTAMP_FILE" ]]; then 
    TIMESTAMP=`cat $TIMESTAMP_FILE`
else
    TIMESTAMP=`date +%s`
fi
SAR_RESULTS_FOLDER="$SAR_FOLDER/$TIMESTAMP"
SAR_OUTPUT_FILE="$SAR_RESULTS_FOLDER/sar-output.bin"
BZIP=${BZIP:-false}
CPU_COUNT=${CPU_COUNT:-`grep -c ^processor /proc/cpuinfo`}

GNUPLOT=${GNUPLOT:-false}
GNUPLOT_SCRIPTS_DIR="$PROJECT_BASEDIR/src/main/gnuplot/sar"
GNUPLOT_COMMON="$GNUPLOT_SCRIPTS_DIR/common.gplot"

function process_cpu_results() {
    RESULTS_FOLDER="$SAR_RESULTS_FOLDER/cpu"; mkdir -p "$RESULTS_FOLDER"
    CPU=${1:-ALL}
    if [ "$CPU" == "ALL" ]; then SAR_PARAMS="-u"; else SAR_PARAMS="-u -P $CPU"; fi
    TXT_FILE="$RESULTS_FOLDER/cpu-$CPU.txt"
    CSV_FILE="${TXT_FILE%.txt}.csv"
    PNG_FILE="${TXT_FILE%.txt}.png"
    sar         $SAR_PARAMS -f   $SAR_OUTPUT_FILE > "$TXT_FILE"
    sadf -d --  $SAR_PARAMS      $SAR_OUTPUT_FILE > "$CSV_FILE"
    if $GNUPLOT; then
        gnuplot -e "datafile='$CSV_FILE'" "$GNUPLOT_COMMON" "$GNUPLOT_SCRIPTS_DIR/cpu.gplot" > "$PNG_FILE"
    fi
}

#function process_net_results() {
#    IFACE=${IFACE:-docker0}
#    RESULTS_FOLDER="$SAR_RESULTS_FOLDER/net"; mkdir -p "$RESULTS_FOLDER"
#    TXT_FILE="$RESULTS_FOLDER/net-$IFACE.txt"
#    CSV_FILE="${TXT_FILE%.txt}.csv"
#    PNG_FILE="${TXT_FILE%.txt}.png"
#    sar         -n DEV -f   $SAR_OUTPUT_FILE > "${TXT_FILE}.tmp"
#    sadf -d --  -n DEV      $SAR_OUTPUT_FILE > "${CSV_FILE}.tmp"
#    head -n 3 "${TXT_FILE}.tmp" > "$TXT_FILE"; grep "$IFACE" "${TXT_FILE}.tmp" >> "$TXT_FILE"; rm "${TXT_FILE}.tmp"
#    head -n 1 "${CSV_FILE}.tmp" > "$CSV_FILE"; grep "$IFACE" "${CSV_FILE}.tmp" >> "$CSV_FILE"; rm "${CSV_FILE}.tmp"
#    if $GNUPLOT; then
#        gnuplot -e "datafile='$CSV_FILE'" "$GNUPLOT_COMMON" "$GNUPLOT_SCRIPTS_DIR/net.gplot" > "$PNG_FILE"
#    fi
#}

function process_io_results() {
    RESULTS_FOLDER="$SAR_RESULTS_FOLDER"
    TXT_FILE="$RESULTS_FOLDER/io.txt"
    CSV_FILE="${TXT_FILE%.txt}.csv"
    sar         -b -f   $SAR_OUTPUT_FILE > "${TXT_FILE}"
    sadf -d --  -b      $SAR_OUTPUT_FILE > "${CSV_FILE}"
    if $GNUPLOT; then
        gnuplot -e "datafile='$CSV_FILE'" "$GNUPLOT_COMMON" "$GNUPLOT_SCRIPTS_DIR/io-requests.gplot" > "${TXT_FILE%.txt}-requests.png"
        gnuplot -e "datafile='$CSV_FILE'" "$GNUPLOT_COMMON" "$GNUPLOT_SCRIPTS_DIR/io-data.gplot" > "${TXT_FILE%.txt}-data.png"
    fi
}

function process_mem_results() {
    RESULTS_FOLDER="$SAR_RESULTS_FOLDER"
    TXT_FILE="$RESULTS_FOLDER/mem.txt"
    CSV_FILE="${TXT_FILE%.txt}.csv"
    PNG_FILE="${TXT_FILE%.txt}.png"
    sar         -r -f   $SAR_OUTPUT_FILE > "${TXT_FILE}"
    sadf -d --  -r      $SAR_OUTPUT_FILE > "${CSV_FILE}"
    if $GNUPLOT; then
        gnuplot -e "datafile='$CSV_FILE'" "$GNUPLOT_COMMON" "$GNUPLOT_SCRIPTS_DIR/mem.gplot" > "$PNG_FILE"
    fi
}

function process_cswch_results() {
    RESULTS_FOLDER="$SAR_RESULTS_FOLDER"
    TXT_FILE="$RESULTS_FOLDER/cswch.txt"
    CSV_FILE="${TXT_FILE%.txt}.csv"
    PNG_FILE="${TXT_FILE%.txt}.png"
    sar         -w -f   $SAR_OUTPUT_FILE > "${TXT_FILE}"
    sadf -d --  -w      $SAR_OUTPUT_FILE > "${CSV_FILE}"
    if $GNUPLOT; then
        gnuplot -e "datafile='$CSV_FILE'" "$GNUPLOT_COMMON" "$GNUPLOT_SCRIPTS_DIR/cswch.gplot" > "$PNG_FILE"
    fi
}


case "$SAR_OPERATION" in

    start)
        if [[ ! -f "$PID_FILE" ]]; then
            echo "Starting sar command."
            mkdir -p $SAR_RESULTS_FOLDER
            echo $TIMESTAMP > $TIMESTAMP_FILE
            sar -A -o "$SAR_OUTPUT_FILE" 2 &>/dev/null & SAR_PID=$! && echo $SAR_PID > $PID_FILE
        fi
    ;;

    stop)
        if [[ -f "$PID_FILE" ]]; then
            echo "Stopping sar command."
            SAR_PID=`cat $PID_FILE`
            kill $SAR_PID && rm $PID_FILE && rm $TIMESTAMP_FILE

            echo "Processing sar output. GNUPLOT: $GNUPLOT"

            # CPU
            mkdir $SAR_RESULTS_FOLDER/cpu

            process_cpu_results
            for CPU in $(seq -f "%02g" 0 $(( CPU_COUNT-1 )) ); do 
                process_cpu_results $CPU
            done

#            for IFACE in $(ls /sys/class/net); do 
#                process_net_results $IFACE
#            done

            process_io_results 
            process_mem_results 
            process_cswch_results 

            if $BZIP; then bzip2 "$SAR_OUTPUT_FILE"; fi

            echo "Done."
        fi
    ;;

esac