Skip to content

Instantly share code, notes, and snippets.

@jhollowe
Forked from CroneKorkN/gist:476778bb669dcb7610ba7f8ac5a930bb
Last active July 11, 2021 03:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jhollowe/c1d0322981d6290195b289043636c3ac to your computer and use it in GitHub Desktop.
Save jhollowe/c1d0322981d6290195b289043636c3ac to your computer and use it in GitHub Desktop.
zfs arc hit ratio monitor
#!/bin/bash
# author: louwrentius, jhollowe
# source: http://louwrentius.com/zfs-on-linux-monitor-cache-hit-ratio.html
INTERVAL=${1:-5}
CURRENT_INTERVAL=$INTERVAL
OLDHITS=0
OLDMISS=0
L2OLDHITS=0
L2OLDMISS=0
i=0
while true
do
RAW=`cat /proc/spl/kstat/zfs/arcstats`
HITS=`echo "$RAW" | grep -w hits | awk '{ print $3}'`
L2HITS=`echo "$RAW" | grep -w l2_hits | awk '{ print $3}'`
MISSES=`echo "$RAW" | grep -w misses | awk '{ print $3}'`
L2MISSES=`echo "$RAW" | grep -w l2_misses | awk '{ print $3}'`
if [ "$i" -eq 0 ]; then
CURRENT_INTERVAL=$(printf "%.0f\n" $(awk '{print $1}' /proc/uptime || echo "1"))
fi
HITRATE=$(((HITS-OLDHITS)/CURRENT_INTERVAL))
L2HITRATE=$(((L2HITS-L2OLDHITS)/CURRENT_INTERVAL))
MISSRATE=$(((MISSES-OLDMISS)/CURRENT_INTERVAL))
L2MISSRATE=$(((L2MISSES-L2OLDMISS)/CURRENT_INTERVAL))
if [ "$i" -eq 0 ]; then
CURRENT_INTERVAL=$INTERVAL
echo -n "SINCE BOOT: "
fi
OLDHITS=$HITS
L2OLDHITS=$L2HITS
OLDMISS=$MISSES
L2OLDMISS=$L2MISSES
REQS=$((HITRATE+MISSRATE))
if [ "$HITRATE" != 0 ] && [ "$REQS" != 0 ]
then
HITPERCENT=`echo "scale=2; (($HITRATE / $REQS) * 100)" | bc`
L2HITPERCENT=`echo "scale=2; (($L2HITRATE / $REQS) * 100)" | bc`
else
HITPERCENT=0
L2HITPERCENT=0
fi
echo "IOPs: $REQS | ARC cache hit ratio: $HITPERCENT % | Hitrate: $HITRATE / Missrate: $MISSRATE | L2ARC $L2HITPERCENT $L2HITRATE / $L2MISSRATE"
((i++))
sleep $INTERVAL
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment