#!/bin/sh

# stat
while IFS= read -r line; do
  case "$line" in
    "cpu "*)	cpu_before=$line;;
    "intr "*)	intr_before=$line;;
    "ctxt "*)	ctxt_before=$line;;
    "softirq "*)softirq_before=$line;;
  esac
done < "/proc/stat"
echo -n "#"
sleep 0.5
echo -n "#"
sleep 0.5
echo -n "#"
sleep 0.5
echo -n "#"
sleep 0.5
echo    "#"
while IFS= read -r line; do
  case "$line" in
    "cpu "*)	cpu_after=$line;;
    "intr "*)	intr_after=$line;;
    "ctxt "*)	ctxt_after=$line;;
    "softirq "*)softirq_after=$line;;
  esac
done < "/proc/stat"

get_val() {
  echo $1 | awk -v col=$2 '{print $col}'
}
percent() {
  p=$(echo "scale=4; ($1 / $2) * 100" | bc)
  printf "%6.2f%%\n" $p
}

# IRQ
intr_total_before=$(get_val "$intr_before" 2)
intr_total_after=$(get_val "$intr_after" 2)

timer_col_no=$(( 3 + `cat /proc/interrupts |grep "arch_timer"|tr -d ':'|awk '{print $1}'`))
intr_timer_before=$(get_val "$intr_before" $timer_col_no)
intr_timer_after=$(get_val "$intr_after" $timer_col_no)

dma_col_no=`cat /proc/interrupts |grep "DMA IRQ"|tr -d ':'|awk '{print $1}'|awk 'NR==1'`

dma_col_no=$(expr 3 + $dma_col_no )
intr_dma_before=$(get_val "$intr_before" $dma_col_no)
intr_dma_after=$(get_val "$intr_after" $dma_col_no)

eth_col_no1=`cat /proc/interrupts |grep "eth"|tr -d ':'|awk '{print $1}'|awk 'NR==1'`
eth_col_no2=`cat /proc/interrupts |grep "eth"|tr -d ':'|awk '{print $1}'|awk 'NR==2'`
eth_col_no1=$(expr 3 + $eth_col_no1 )
eth_col_no2=$(expr 3 + $eth_col_no2 )
intr_eth_before1=$(get_val "$intr_before" $eth_col_no1)
intr_eth_before2=$(get_val "$intr_before" $eth_col_no2)
intr_eth_before=$(expr $intr_eth_before1 + $intr_eth_before2)
intr_eth_after1=$(get_val "$intr_after" $eth_col_no1)
intr_eth_after2=$(get_val "$intr_after" $eth_col_no2)
intr_eth_after=$(expr $intr_eth_after1 + $intr_eth_after2)

# softirq
softirq_total_before=$(get_val "$softirq_before" 2)
softirq_hi_before=$(get_val "$softirq_before" 3)
softirq_timer_before=$(get_val "$softirq_before" 4)
softirq_net_tx_before=$(get_val "$softirq_before" 5)
softirq_net_rx_before=$(get_val "$softirq_before" 6)
softirq_tasklet_before=$(get_val "$softirq_before" 9)
softirq_hrtimer_before=$(get_val "$softirq_before" 11)
softirq_rcu_before=$(get_val "$softirq_before" 12)

softirq_total_after=$(get_val "$softirq_after" 2)
softirq_hi_after=$(get_val "$softirq_after" 3)
softirq_timer_after=$(get_val "$softirq_after" 4)
softirq_net_tx_after=$(get_val "$softirq_after" 5)
softirq_net_rx_after=$(get_val "$softirq_after" 6)
softirq_tasklet_after=$(get_val "$softirq_after" 9)
softirq_hrtimer_after=$(get_val "$softirq_after" 11)
softirq_rcu_after=$(get_val "$softirq_after" 12)

# CPU
cpu_user_before=$(get_val "$cpu_before" 2)
cpu_system_before=$(get_val "$cpu_before" 4)
cpu_idle_before=$(get_val "$cpu_before" 5)
cpu_irq_before=$(get_val "$cpu_before" 7)
cpu_softirq_before=$(get_val "$cpu_before" 8)
cpu_total_before=$(( $cpu_user_before + $cpu_system_before + $cpu_idle_before + $cpu_irq_before + $cpu_softirq_before ))

cpu_user_after=$(get_val "$cpu_after" 2)
cpu_system_after=$(get_val "$cpu_after" 4)
cpu_idle_after=$(get_val "$cpu_after" 5)
cpu_irq_after=$(get_val "$cpu_after" 7)
cpu_softirq_after=$(get_val "$cpu_after" 8)
cpu_total_after=$(( $cpu_user_after + $cpu_system_after + $cpu_idle_after + $cpu_irq_after + $cpu_softirq_after ))

ctxt_before=`echo $ctxt_before|awk '{print $2}'`
ctxt_after=`echo $ctxt_after|awk '{print $2}'`

cpu_user_increment=$((cpu_user_after - cpu_user_before))
cpu_system_increment=$((cpu_system_after - cpu_system_before))
cpu_idle_increment=$((cpu_idle_after - cpu_idle_before))
cpu_irq_increment=$((cpu_irq_after - cpu_irq_before))
cpu_softirq_increment=$((cpu_softirq_after - cpu_softirq_before))
ctxt_increment=$((ctxt_after - ctxt_before))
cpu_total_increment=$((cpu_total_after - cpu_total_before))

p_user=$(percent $cpu_user_increment $cpu_total_increment)
p_system=$(percent $cpu_system_increment $cpu_total_increment)
p_idle=$(percent $cpu_idle_increment $cpu_total_increment)
p_irq=$(percent $cpu_irq_increment $cpu_total_increment)
p_softirq=$(percent $cpu_softirq_increment $cpu_total_increment)

intr_total_increment=$((intr_total_after - intr_total_before))
intr_timer_increment=$((intr_timer_after - intr_timer_before))
intr_dma_increment=$((intr_dma_after - intr_dma_before))
intr_eth_increment=$((intr_eth_after - intr_eth_before))

softirq_timer_increment=$((softirq_timer_after - softirq_timer_before))
softirq_net_tx_increment=$((softirq_net_tx_after - softirq_net_tx_before))
softirq_net_rx_increment=$((softirq_net_rx_after - softirq_net_rx_before))
softirq_tasklet_increment=$((softirq_tasklet_after - softirq_tasklet_before))
softirq_hi_increment=$((softirq_hi_after - softirq_hi_before))
softirq_hrtimer_increment=$((softirq_hrtimer_after - softirq_hrtimer_before))

echo "CPU"
echo "user   : +$cpu_user_increment	$p_user"
echo "system : +$cpu_system_increment	$p_system"
echo "idle   : +$cpu_idle_increment	$p_idle"
echo "irq    : +$cpu_irq_increment	$p_irq"
echo "softirq: +$cpu_softirq_increment	$p_softirq"
echo "ctxt   : +$ctxt_increment	$ctxt_before -> $ctxt_after"
echo
echo "IRQ"
echo "total  : +$intr_total_increment	$intr_total_before -> $intr_total_after"
echo "timer  : +$intr_timer_increment	$intr_timer_before -> $intr_timer_after"
echo "dma    : +$intr_dma_increment	$intr_dma_before -> $intr_dma_after"
echo "eth    : +$intr_eth_increment	$intr_eth_before -> $intr_eth_after"
echo
echo "softirqs"
echo "TIMER  : +$softirq_timer_increment	$softirq_timer_before -> $softirq_timer_after"
echo "NET_TX : +$softirq_net_tx_increment	$softirq_net_tx_before -> $softirq_net_tx_after"
echo "NET_RX : +$softirq_net_rx_increment	$softirq_net_rx_before -> $softirq_net_rx_after"
echo "TASKLET: +$softirq_tasklet_increment	$softirq_tasklet_before -> $softirq_tasklet_after"
echo "HI     : +$softirq_hi_increment	$softirq_hi_before -> $softirq_hi_after"
echo "HRTIMER: +$softirq_hrtimer_increment	$softirq_hrtimer_before -> $softirq_hrtimer_after"

