Skip to content

Instantly share code, notes, and snippets.

@dlanderson
Forked from omame/zfs-arc-statsd.sh
Created November 24, 2015 17:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dlanderson/2ae81a4da576def641f2 to your computer and use it in GitHub Desktop.
Save dlanderson/2ae81a4da576def641f2 to your computer and use it in GitHub Desktop.
Send ZFS Linux metrics to statsd
#!/bin/bash
# A port of ZFS stats for FreeBSD plugin to Linux, adapted to send metrics to statsd.
#
# Author: Daniele Valeriani <daniele@valeriani.co.uk>
# Author of the original munin plugin: David Bjornsson <dabb@lolnet.is>
# Author of the Linux port: Alex Chistyakov <alexclear@gmail.com>
PREFIX="servers.`hostname`.zfs"
STATSD_ADDR="YOUR STATSD SERVER"
STATSD_PORT="PROBABLY 2003"
DATE=`date +%s`
NC=`which nc`
function arcstats() {
awk /^${1}\ /'{print $3}' /proc/spl/kstat/zfs/arcstats
}
ARC_HITS=`arcstats hits`
ARC_MISSES=`arcstats misses`
DEMAND_DATA_HITS=`arcstats demand_data_hits`
DEMAND_DATA_MISSES=`arcstats demand_data_misses`
DEMAND_METADATA_HITS=`arcstats demand_metadata_hits`
DEMAND_METADATA_MISSES=`arcstats demand_metadata_misses`
MFU_GHOST_HITS=`arcstats mfu_ghost_hits`
MFU_HITS=`arcstats mfu_hits`
MRU_GHOST_HITS=`arcstats mru_ghost_hits`
MRU_HITS=`arcstats mru_hits`
PREFETCH_DATA_HITS=`arcstats prefetch_data_hits`
PREFETCH_DATA_MISSES=`arcstats prefetch_data_misses`
PREFETCH_METADATA_HITS=`arcstats prefetch_metadata_hits`
PREFETCH_METADATA_MISSES=`arcstats prefetch_metadata_misses`
SIZE=`arcstats size`
MRU_SIZE=`arcstats 'p'`
MAX_SIZE=`arcstats c_max`
MIN_SIZE=`arcstats c_min`
TARGET_SIZE=`arcstats c`
L2_SIZE=`arcstats l2_size`
L2_HDR_SIZE=`arcstats l2_hdr_size`
L2_HITS=`arcstats l2_hits`
L2_MISSES=`arcstats l2_misses`
# Calculations
ANON_HITS=$((ARC_HITS-(MFU_HITS+MRU_HITS+MFU_GHOST_HITS+MRU_GHOST_HITS)))
ARC_ACCESSES_TOTAL=$((ARC_HITS+ARC_MISSES))
DEMAND_DATA_TOTAL=$((DEMAND_DATA_HITS+DEMAND_DATA_MISSES))
PREFETCH_DATA_TOTAL=$((PREFETCH_DATA_HITS+PREFETCH_DATA_MISSES))
REAL_HITS=$((MFU_HITS+MRU_HITS))
CACHE_HIT_RATIO_PERC=` echo - | awk "{printf \"%.2f\", (100*$ARC_HITS/$ARC_ACCESSES_TOTAL)}"`
CACHE_MISS_RATIO_PERC=` echo - | awk "{printf \"%.2f\", (100*$ARC_MISSES/$ARC_ACCESSES_TOTAL)}"`
ACTUAL_HIT_RATIO_PERC=` echo - | awk "{printf \"%.2f\", (100*$REAL_HITS/$ARC_ACCESSES_TOTAL)}"`
DATA_DEMAND_EFFICIENCY_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_DATA_HITS/$DEMAND_DATA_TOTAL)}"`
DATA_PREFETCH_EFFICENCY_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_DATA_HITS/$PREFETCH_DATA_TOTAL)}"`
ANONYMOUSLY_USED_PERC=` echo - | awk "{printf \"%.2f\", (100*$ANON_HITS/$ARC_HITS)}"`
MOST_RECENTLY_USED_PERC=` echo - | awk "{printf \"%.2f\", (100*$MRU_HITS/$ARC_HITS)}"`
MOST_FREQUENTLY_USED_PERC=` echo - | awk "{printf \"%.2f\", (100*$MFU_HITS/$ARC_HITS)}"`
MOST_RECENTLY_USED_GHOST_PERC=` echo - | awk "{printf \"%.2f\", (100*$MRU_GHOST_HITS/$ARC_HITS)}"`
MOST_FREQUENTLY_USED_GHOST_PERC=` echo - | awk "{printf \"%.2f\", (100*$MFU_GHOST_HITS/$ARC_HITS)}"`
DEMAND_DATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_DATA_HITS/$ARC_HITS)}"`
DEMAND_DATA_MISS_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_DATA_MISSES/$ARC_MISSES)}"`
PREFETCH_DATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_DATA_HITS/$ARC_HITS)}"`
PREFETCH_DATA_MISS_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_DATA_MISSES/$ARC_MISSES)}"`
DEMAND_METADATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_METADATA_HITS/$ARC_HITS)}"`
DEMAND_METADATA_MISS_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_METADATA_MISSES/$ARC_MISSES)}"`
PREFETCH_METADATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_METADATA_HITS/$ARC_HITS)}"`
PREFETCH_METADATA_MISSES_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_METADATA_MISSES/$ARC_MISSES)}"`
if [ $SIZE -gt $TARGET_SIZE ]; then
MFU_SIZE=$((SIZE-MRU_SIZE))
else
MFU_SIZE=$((TARGET_SIZE-MRU_SIZE))
fi
L2_ACCESSES_TOTAL=$((L2_HITS+L2_MISSES))
if [ $L2_ACCESSES_TOTAL -gt 0 ]; then
L2_HIT_RATIO_PERC=`echo - | awk "{printf \"%.2f\", (100*$L2_HITS/$L2_ACCESSES_TOTAL)}"`
L2_MISS_RATIO_PERC=`echo - | awk "{printf \"%.2f\", (100*$L2_MISSES/$L2_ACCESSES_TOTAL)}"`
else
L2_HIT_RATIO_PERC=0
L2_MISS_RATIO_PERC=0
fi
# Send everything to statsd
echo "$PREFIX.arc_hits $ARC_HITS $DATE
$PREFIX.arc_misses $ARC_MISSES $DATE
$PREFIX.demand_data_hits $DEMAND_DATA_HITS $DATE
$PREFIX.demand_data_misses $DEMAND_DATA_MISSES $DATE
$PREFIX.demand_metadata_hits $DEMAND_METADATA_HITS $DATE
$PREFIX.demand_metadata_misses $DEMAND_METADATA_MISSES $DATE
$PREFIX.mfu_ghost_hits $MFU_GHOST_HITS $DATE
$PREFIX.mfu_hits $MFU_HITS $DATE
$PREFIX.mru_ghost_hits $MRU_GHOST_HITS $DATE
$PREFIX.mru_hits $MRU_HITS $DATE
$PREFIX.prefetch_data_hits $PREFETCH_DATA_HITS $DATE
$PREFIX.prefetch_data_misses $PREFETCH_DATA_MISSES $DATE
$PREFIX.prefetch_metadata_hits $PREFETCH_METADATA_HITS $DATE
$PREFIX.prefetch_metadata_misses $PREFETCH_METADATA_MISSES $DATE
$PREFIX.size $SIZE $DATE
$PREFIX.mru_size $MRU_SIZE $DATE
$PREFIX.max_size $MAX_SIZE $DATE
$PREFIX.min_size $MIN_SIZE $DATE
$PREFIX.target_size $TARGET_SIZE $DATE
$PREFIX.l2_size $L2_SIZE $DATE
$PREFIX.l2_hdr_size $L2_HDR_SIZE $DATE
$PREFIX.l2_hits $L2_HITS $DATE
$PREFIX.l2_misses $L2_MISSES $DATE
$PREFIX.anon_hits $ANON_HITS $DATE
$PREFIX.arc_accesses_total $ARC_ACCESSES_TOTAL $DATE
$PREFIX.demand_data_total $DEMAND_DATA_TOTAL $DATE
$PREFIX.prefetch_data_total $PREFETCH_DATA_TOTAL $DATE
$PREFIX.real_hits $REAL_HITS $DATE
$PREFIX.cache_hit_ratio_perc $CACHE_HIT_RATIO_PERC $DATE
$PREFIX.cache_miss_ratio_perc $CACHE_MISS_RATIO_PERC $DATE
$PREFIX.actual_hit_ratio_perc $ACTUAL_HIT_RATIO_PERC $DATE
$PREFIX.data_demand_efficiency_perc $DATA_DEMAND_EFFICIENCY_PERC $DATE
$PREFIX.data_prefetch_efficency_perc $DATA_PREFETCH_EFFICENCY_PERC $DATE
$PREFIX.anonymously_used_perc $ANONYMOUSLY_USED_PERC $DATE
$PREFIX.most_recently_used_perc $MOST_RECENTLY_USED_PERC $DATE
$PREFIX.most_frequently_used_perc $MOST_FREQUENTLY_USED_PERC $DATE
$PREFIX.most_recently_used_ghost_perc $MOST_RECENTLY_USED_GHOST_PERC $DATE
$PREFIX.most_frequently_used_ghost_perc $MOST_FREQUENTLY_USED_GHOST_PERC $DATE
$PREFIX.demand_data_hit_perc $DEMAND_DATA_HIT_PERC $DATE
$PREFIX.demand_data_miss_perc $DEMAND_DATA_MISS_PERC $DATE
$PREFIX.prefetch_data_hit_perc $PREFETCH_DATA_HIT_PERC $DATE
$PREFIX.prefetch_data_miss_perc $PREFETCH_DATA_MISS_PERC $DATE
$PREFIX.demand_metadata_hit_perc $DEMAND_METADATA_HIT_PERC $DATE
$PREFIX.demand_metadata_miss_perc $DEMAND_METADATA_MISS_PERC $DATE
$PREFIX.prefetch_metadata_hit_perc $PREFETCH_METADATA_HIT_PERC $DATE
$PREFIX.prefetch_metadata_misses_perc $PREFETCH_METADATA_MISSES_PERC $DATE
$PREFIX.mfu_size $MFU_SIZE $DATE
$PREFIX.l2_accesses_total $L2_ACCESSES_TOTAL $DATE
$PREFIX.l2_hit_ratio_perc $L2_HIT_RATIO_PERC $DATE
$PREFIX.l2_miss_ratio_perc $L2_MISS_RATIO_PERC $DATE" | $NC $STATSD_ADDR $STATSD_PORT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment