root / plugins / zfs / zfsonlinux_stats_ @ e3842681
Historique | Voir | Annoter | Télécharger (11,9 ko)
| 1 | c1475343 | amichel | #!/usr/bin/env bash |
|---|---|---|---|
| 2 | 7f928fb5 | amichel | # ZFS statistics for ZFSonLinux |
| 3 | # Author: Adam Michel (elfurbe@furbism.com) |
||
| 4 | # |
||
| 5 | # Description: |
||
| 6 | # This is a modification of the zfs_stats |
||
| 7 | # plugin by David Bjornsson (which was a |
||
| 8 | # rewrite of zfs-stats-for-freebsd scripts |
||
| 9 | # by patpro) modified to work with ZFSonLinux. |
||
| 10 | # |
||
| 11 | # Tested on Ubuntu-14.04 |
||
| 12 | # |
||
| 13 | # Usage: zfs_stats_FUNCTION |
||
| 14 | # |
||
| 15 | # Available functions: |
||
| 16 | # efficiency - ARC efficiency |
||
| 17 | # cachehitlist - Cache hit by cache list |
||
| 18 | # cachehitdtype - Cache hit by data type |
||
| 19 | # dmuprefetch - DMU prefetch |
||
| 20 | # utilization - ARC size breakdown |
||
| 21 | # l2utilization - L2ARC size breakdown |
||
| 22 | # l2efficiency - L2ARC efficiency |
||
| 23 | # |
||
| 24 | #%# family=auto |
||
| 25 | |||
| 26 | FUNCTION=$(basename $0 | cut -d_ -f3) |
||
| 27 | MEMMAX=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
|
||
| 28 | BC='/usr/bin/bc -q' |
||
| 29 | ARCSTATS="/proc/spl/kstat/zfs/arcstats" |
||
| 30 | ZFETCHSTATS="/proc/spl/kstat/zfs/zfetchstats" |
||
| 31 | |||
| 32 | 940fe451 | Adam Michel | # |
| 33 | # Pull all values from arcstats |
||
| 34 | # |
||
| 35 | 7f928fb5 | amichel | |
| 36 | 940fe451 | Adam Michel | while read name type data |
| 37 | do |
||
| 38 | [[ $name =~ ^[0-9].* ]] && continue |
||
| 39 | [[ $name == "name" ]] && continue |
||
| 40 | 4f0a708d | Peter Doherty | [[ $name == "" ]] && continue |
| 41 | 940fe451 | Adam Michel | case $name in |
| 42 | "hits" ) |
||
| 43 | export ARC_HITS=$data |
||
| 44 | ;; |
||
| 45 | "misses" ) |
||
| 46 | export ARC_MISSES=$data |
||
| 47 | ;; |
||
| 48 | "p" ) |
||
| 49 | export MRU_SIZE=$data |
||
| 50 | ;; |
||
| 51 | "c_max" ) |
||
| 52 | export MAX_SIZE=$data |
||
| 53 | ;; |
||
| 54 | "c_min" ) |
||
| 55 | export MIN_SIZE=$data |
||
| 56 | ;; |
||
| 57 | "c" ) |
||
| 58 | export TARGET_SIZE=$data |
||
| 59 | ;; |
||
| 60 | * ) |
||
| 61 | VARNAME=`echo $name | tr '[:lower:]' '[:upper:]'` |
||
| 62 | #declare $VARNAME=$data |
||
| 63 | export $VARNAME=$data |
||
| 64 | ;; |
||
| 65 | esac |
||
| 66 | 26cac8f8 | Adam Michel | done < $ARCSTATS |
| 67 | 7f928fb5 | amichel | |
| 68 | 940fe451 | Adam Michel | # |
| 69 | # Pull all values from zfetchstats |
||
| 70 | # |
||
| 71 | 7f928fb5 | amichel | |
| 72 | 940fe451 | Adam Michel | while read name type data |
| 73 | do |
||
| 74 | [[ $name =~ ^[0-9].* ]] && continue |
||
| 75 | [[ $name == "name" ]] && continue |
||
| 76 | case $name in |
||
| 77 | "hits" ) |
||
| 78 | export DMU_HITS=$data |
||
| 79 | ;; |
||
| 80 | "misses" ) |
||
| 81 | export DMU_MISSES=$data |
||
| 82 | ;; |
||
| 83 | * ) |
||
| 84 | VARNAME=`echo $name | tr '[:lower:]' '[:upper:]'` |
||
| 85 | export $VARNAME=$data |
||
| 86 | ;; |
||
| 87 | esac |
||
| 88 | 26cac8f8 | Adam Michel | done < $ZFETCHSTATS |
| 89 | 7f928fb5 | amichel | |
| 90 | # |
||
| 91 | # Calculation macros |
||
| 92 | # |
||
| 93 | |||
| 94 | ANON_HITS=`echo "$ARC_HITS-($MFU_HITS+$MRU_HITS+$MFU_GHOST_HITS+$MRU_GHOST_HITS)" | $BC` |
||
| 95 | ARC_ACCESSES_TOTAL=`echo "$ARC_HITS+$ARC_MISSES" | $BC` |
||
| 96 | DEMAND_DATA_TOTAL=`echo "$DEMAND_DATA_HITS+$DEMAND_DATA_MISSES" | $BC` |
||
| 97 | PREFETCH_DATA_TOTAL=`echo "$PREFETCH_DATA_HITS+$PREFETCH_DATA_MISSES" | $BC` |
||
| 98 | REAL_HITS=`echo "$MFU_HITS+$MRU_HITS" | $BC` |
||
| 99 | |||
| 100 | if [ $ARC_ACCESSES_TOTAL != 0 ]; then |
||
| 101 | CACHE_HIT_RATIO_PERC=`echo "scale=2 ; (100*$ARC_HITS/$ARC_ACCESSES_TOTAL)" | $BC` |
||
| 102 | CACHE_MISS_RATIO_PERC=`echo "scale=2 ; (100*$ARC_MISSES/$ARC_ACCESSES_TOTAL)" | $BC` |
||
| 103 | ACTUAL_HIT_RATIO_PERC=`echo "scale=2 ; (100*$REAL_HITS/$ARC_ACCESSES_TOTAL)" | $BC` |
||
| 104 | else |
||
| 105 | CACHE_HIT_RATIO_PERC=0 |
||
| 106 | CACHE_MISS_RATIO_PERC=0 |
||
| 107 | ACTUAL_HIT_RATIO_PERC=0 |
||
| 108 | fi |
||
| 109 | |||
| 110 | if [ $DEMAND_DATA_TOTAL != 0 ]; then DATA_DEMAND_EFFICIENCY_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_HITS/$DEMAND_DATA_TOTAL)" | $BC`; else DATA_DEMAND_EFFICIENCY_PERC=0; fi |
||
| 111 | if [ $PREFETCH_DATA_TOTAL != 0 ]; then DATA_PREFETCH_EFFICENCY_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$PREFETCH_DATA_TOTAL)" | $BC`; else DATA_PREFETCH_EFFICENCY_PERC=0; fi |
||
| 112 | |||
| 113 | if [ $ARC_HITS != 0 ]; then |
||
| 114 | ANONYMOUSLY_USED_PERC=`echo "scale=2 ; (100*$ANON_HITS/$ARC_HITS)" | $BC` |
||
| 115 | MOST_RECENTLY_USED_PERC=`echo "scale=2 ; (100*$MRU_HITS/$ARC_HITS)" | $BC` |
||
| 116 | MOST_FREQUENTLY_USED_PERC=`echo "scale=2 ; (100*$MFU_HITS/$ARC_HITS)" | $BC` |
||
| 117 | MOST_RECENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MRU_GHOST_HITS/$ARC_HITS)" | $BC` |
||
| 118 | MOST_FREQUENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MFU_GHOST_HITS/$ARC_HITS)" | $BC` |
||
| 119 | |||
| 120 | DEMAND_DATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_HITS/$ARC_HITS)" | $BC` |
||
| 121 | PREFETCH_DATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$ARC_HITS)" | $BC` |
||
| 122 | DEMAND_METADATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_HITS/$ARC_HITS)" | $BC` |
||
| 123 | PREFETCH_METADATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_HITS/$ARC_HITS)" | $BC` |
||
| 124 | else |
||
| 125 | ANONYMOUSLY_USED_PERC=0 |
||
| 126 | MOST_RECENTLY_USED_PERC=0 |
||
| 127 | MOST_FREQUENTLY_USED_PERC=0 |
||
| 128 | MOST_RECENTLY_USED_GHOST_PERC=0 |
||
| 129 | MOST_FREQUENTLY_USED_GHOST_PERC=0 |
||
| 130 | |||
| 131 | DEMAND_DATA_HIT_PERC=0 |
||
| 132 | PREFETCH_DATA_HIT_PERC=0 |
||
| 133 | DEMAND_METADATA_HIT_PERC=0 |
||
| 134 | PREFETCH_METADATA_HIT_PERC=0 |
||
| 135 | fi |
||
| 136 | |||
| 137 | if [ $ARC_MISSES != 0 ]; then |
||
| 138 | PREFETCH_METADATA_MISSES_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_MISSES/$ARC_MISSES)" | $BC` |
||
| 139 | DEMAND_DATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_MISSES/$ARC_MISSES)" | $BC` |
||
| 140 | PREFETCH_DATA_MISS_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_MISSES/$ARC_MISSES)" | $BC` |
||
| 141 | DEMAND_METADATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_MISSES/$ARC_MISSES)" | $BC` |
||
| 142 | else |
||
| 143 | PREFETCH_METADATA_MISSES_PERC=0 |
||
| 144 | DEMAND_DATA_MISS_PERC=0 |
||
| 145 | PREFETCH_DATA_MISS_PERC=0 |
||
| 146 | DEMAND_METADATA_MISS_PERC=0 |
||
| 147 | fi |
||
| 148 | |||
| 149 | DMU_TOTAL=`echo "$DMU_HITS+$DMU_MISSES" | $BC` |
||
| 150 | if [ $DMU_TOTAL != 0 ]; then |
||
| 151 | DMU_HITS_PERC=`echo "scale=2 ; (100*$DMU_HITS/$DMU_TOTAL)" | $BC` |
||
| 152 | DMU_MISSES_PERC=`echo "scale=2 ; (100*$DMU_MISSES/$DMU_TOTAL)" | $BC` |
||
| 153 | else |
||
| 154 | DMU_HITS_PERC=0 |
||
| 155 | DMU_MISSES_PERC=0 |
||
| 156 | fi |
||
| 157 | |||
| 158 | if [ $SIZE -gt $TARGET_SIZE ]; then |
||
| 159 | MFU_SIZE=`echo "$SIZE-$MRU_SIZE" | $BC` |
||
| 160 | else |
||
| 161 | MFU_SIZE=`echo "$TARGET_SIZE-$MRU_SIZE" | $BC` |
||
| 162 | fi |
||
| 163 | |||
| 164 | L2_ACCESSES_TOTAL=`echo "$L2_HITS+$L2_MISSES" | $BC` |
||
| 165 | if [ $L2_ACCESSES_TOTAL -gt 0 ]; then |
||
| 166 | L2_HIT_RATIO_PERC=`echo "scale=2 ; (100*$L2_HITS/$L2_ACCESSES_TOTAL)" | $BC` |
||
| 167 | L2_MISS_RATIO_PERC=`echo "scale=2 ; (100*$L2_MISSES/$L2_ACCESSES_TOTAL)" | $BC` |
||
| 168 | else |
||
| 169 | L2_HIT_RATIO_PERC=0 |
||
| 170 | L2_MISS_RATIO_PERC=0 |
||
| 171 | fi |
||
| 172 | |||
| 173 | efficiency() {
|
||
| 174 | if [ "$1" = "config" ]; then |
||
| 175 | echo 'graph_title ZFS ARC Efficiency' |
||
| 176 | echo 'graph_args -u 100' |
||
| 177 | echo 'graph_vlabel %' |
||
| 178 | echo 'graph_info This graph shows the ARC Efficiency' |
||
| 179 | |||
| 180 | echo 'hits.label Hit Ratio' |
||
| 181 | echo 'misses.label Miss Ratio' |
||
| 182 | echo 'actual_hits.label Actual Hit Ratio' |
||
| 183 | echo 'data_demand_efficiency.label Data Demand Efficiency' |
||
| 184 | echo 'data_prefetch_efficiency.label Data Prefetch Efficiency' |
||
| 185 | |||
| 186 | exit 0 |
||
| 187 | else |
||
| 188 | echo 'hits.value ' $CACHE_HIT_RATIO_PERC |
||
| 189 | echo 'misses.value ' $CACHE_MISS_RATIO_PERC |
||
| 190 | echo 'actual_hits.value ' $ACTUAL_HIT_RATIO_PERC |
||
| 191 | echo 'data_demand_efficiency.value ' $DATA_DEMAND_EFFICIENCY_PERC |
||
| 192 | echo 'data_prefetch_efficiency.value ' $DATA_PREFETCH_EFFICENCY_PERC |
||
| 193 | fi |
||
| 194 | } |
||
| 195 | |||
| 196 | cachehitlist() {
|
||
| 197 | if [ "$1" = "config" ]; then |
||
| 198 | echo 'graph_title ZFS ARC Efficiency: Cache hits by cache list' |
||
| 199 | echo 'graph_args -u 100' |
||
| 200 | echo 'graph_vlabel %' |
||
| 201 | echo 'graph_info This graph shows the ARC Efficiency' |
||
| 202 | |||
| 203 | echo 'cache_list_anon.label Anonymously Used' |
||
| 204 | echo 'cache_list_most_rec.label Most Recently Used' |
||
| 205 | echo 'cache_list_most_freq.label Most Frequently Used' |
||
| 206 | echo 'cache_list_most_rec_ghost.label Most Recently Used Ghost' |
||
| 207 | echo 'cache_list_most_freq_ghost.label Most Frequently Used Ghost' |
||
| 208 | |||
| 209 | exit 0 |
||
| 210 | else |
||
| 211 | echo 'cache_list_anon.value ' $ANONYMOUSLY_USED_PERC |
||
| 212 | echo 'cache_list_most_rec.value ' $MOST_RECENTLY_USED_PERC |
||
| 213 | echo 'cache_list_most_freq.value ' $MOST_FREQUENTLY_USED_PERC |
||
| 214 | echo 'cache_list_most_rec_ghost.value ' $MOST_RECENTLY_USED_GHOST_PERC |
||
| 215 | echo 'cache_list_most_freq_ghost.value ' $MOST_FREQUENTLY_USED_GHOST_PERC |
||
| 216 | fi |
||
| 217 | } |
||
| 218 | |||
| 219 | cachehitdtype() {
|
||
| 220 | if [ "$1" = "config" ]; then |
||
| 221 | echo 'graph_title ZFS ARC Efficiency: Cache hits by data type' |
||
| 222 | echo 'graph_args -u 100' |
||
| 223 | echo 'graph_vlabel %' |
||
| 224 | echo 'graph_info This graph shows the ARC Efficiency' |
||
| 225 | |||
| 226 | echo 'data_type_demand_hits.label Demand Data Hit Ratio' |
||
| 227 | echo 'data_type_demand_misses.label Demand Data Miss Ratio' |
||
| 228 | echo 'data_type_prefetch_hits.label Prefetch Data Hit Ratio' |
||
| 229 | echo 'data_type_prefetch_misses.label Prefetch Data Miss Ratio' |
||
| 230 | echo 'data_type_demand_metadata_hits.label Demand Metadata Hit Ratio' |
||
| 231 | echo 'data_type_demand_metadata_misses.label Demand Metadata Miss Ratio' |
||
| 232 | echo 'data_type_prefetch_metadata_hits.label Prefetch Metadata Hit Ratio' |
||
| 233 | echo 'data_type_prefetch_metadata_misses.label Prefetch Metadata Miss Ratio' |
||
| 234 | |||
| 235 | exit 0 |
||
| 236 | else |
||
| 237 | echo 'data_type_demand_hits.value ' $DEMAND_DATA_HIT_PERC |
||
| 238 | echo 'data_type_demand_misses.value ' $DEMAND_DATA_MISS_PERC |
||
| 239 | echo 'data_type_prefetch_hits.value ' $PREFETCH_DATA_HIT_PERC |
||
| 240 | echo 'data_type_prefetch_misses.value ' $PREFETCH_DATA_MISS_PERC |
||
| 241 | echo 'data_type_demand_metadata_hits.value ' $DEMAND_METADATA_HIT_PERC |
||
| 242 | echo 'data_type_demand_metadata_misses.value ' $DEMAND_METADATA_MISS_PERC |
||
| 243 | echo 'data_type_prefetch_metadata_hits.value ' $PREFETCH_METADATA_HIT_PERC |
||
| 244 | echo 'data_type_prefetch_metadata_misses.value ' $PREFETCH_METADATA_MISSES_PERC |
||
| 245 | fi |
||
| 246 | } |
||
| 247 | |||
| 248 | dmuprefetch() {
|
||
| 249 | if [ "$1" = "config" ]; then |
||
| 250 | echo 'graph_title ZFS DMU prefetch stats' |
||
| 251 | echo 'graph_args -u 100' |
||
| 252 | echo 'graph_vlabel %' |
||
| 253 | echo 'graph_info This graph shows the DMU prefetch stats' |
||
| 254 | |||
| 255 | echo 'hits.label Hit Ratio' |
||
| 256 | echo 'misses.label Miss Ratio' |
||
| 257 | |||
| 258 | exit 0 |
||
| 259 | else |
||
| 260 | echo 'hits.value ' $DMU_HITS_PERC |
||
| 261 | echo 'misses.value ' $DMU_MISSES_PERC |
||
| 262 | fi |
||
| 263 | } |
||
| 264 | |||
| 265 | utilization() {
|
||
| 266 | if [ "$1" = "config" ]; then |
||
| 267 | echo 'graph_title ZFS ARC Size' |
||
| 268 | echo 'graph_args --base 1024 -l 0 --vertical-label Bytes --upper-limit '$MEMMAX |
||
| 269 | echo 'graph_vlabel Size in MB' |
||
| 270 | echo 'graph_info This graph shows the ARC Size utilization' |
||
| 271 | |||
| 272 | echo 'max_size.label Maximum Size' |
||
| 273 | echo 'max_size.draw AREA' |
||
| 274 | echo 'size.label Size' |
||
| 275 | echo 'size.draw AREA' |
||
| 276 | echo 'min_size.label Minimum Size' |
||
| 277 | echo 'min_size.draw AREA' |
||
| 278 | echo 'target_size.label Target Size' |
||
| 279 | echo 'target_size.draw LINE1' |
||
| 280 | echo 'recently_size.label Recently Used Cache Size' |
||
| 281 | echo 'recently_size.draw LINE1' |
||
| 282 | echo 'frequently_size.label Frequently Used Cache Size' |
||
| 283 | echo 'frequently_size.draw LINE1' |
||
| 284 | |||
| 285 | exit 0 |
||
| 286 | else |
||
| 287 | echo 'max_size.value ' $MAX_SIZE |
||
| 288 | echo 'size.value ' $SIZE |
||
| 289 | echo 'min_size.value ' $MIN_SIZE |
||
| 290 | echo 'target_size.value ' $TARGET_SIZE |
||
| 291 | echo 'recently_size.value ' $MRU_SIZE |
||
| 292 | echo 'frequently_size.value ' $MFU_SIZE |
||
| 293 | fi |
||
| 294 | } |
||
| 295 | |||
| 296 | l2utilization() {
|
||
| 297 | if [ "$1" = "config" ]; then |
||
| 298 | echo 'graph_title ZFS L2ARC Size' |
||
| 299 | echo 'graph_args --base 1024 -r -l 0 --vertical-label Bytes' |
||
| 300 | echo 'graph_vlabel Size in MB' |
||
| 301 | echo 'graph_info This graph shows the L2ARC Size utilization' |
||
| 302 | |||
| 303 | echo 'size.label Size' |
||
| 304 | echo 'size.draw AREA' |
||
| 305 | echo 'hdr_size.label Header Size' |
||
| 306 | echo 'hdr_size.draw AREA' |
||
| 307 | |||
| 308 | exit 0 |
||
| 309 | else |
||
| 310 | echo 'size.value ' $L2_SIZE |
||
| 311 | echo 'hdr_size.value ' $L2_HDR_SIZE |
||
| 312 | fi |
||
| 313 | } |
||
| 314 | |||
| 315 | l2efficiency() {
|
||
| 316 | if [ "$1" = "config" ]; then |
||
| 317 | echo 'graph_title ZFS L2ARC Efficiency' |
||
| 318 | echo 'graph_args -u 100' |
||
| 319 | echo 'graph_vlabel %' |
||
| 320 | echo 'graph_info This graph shows the L2ARC Efficiency' |
||
| 321 | |||
| 322 | echo 'l2_hits.label Hit Ratio' |
||
| 323 | echo 'l2_misses.label Miss Ratio' |
||
| 324 | else |
||
| 325 | echo 'l2_hits.value ' $L2_HIT_RATIO_PERC |
||
| 326 | echo 'l2_misses.value ' $L2_MISS_RATIO_PERC |
||
| 327 | fi |
||
| 328 | |||
| 329 | } |
||
| 330 | |||
| 331 | 65652aa0 | dipohl | [ "$1" = "config" ] && echo "graph_category fs" |
| 332 | 7f928fb5 | amichel | |
| 333 | case "$FUNCTION" in |
||
| 334 | efficiency) |
||
| 335 | efficiency $1 |
||
| 336 | ;; |
||
| 337 | cachehitlist) |
||
| 338 | cachehitlist $1 |
||
| 339 | ;; |
||
| 340 | cachehitdtype) |
||
| 341 | cachehitdtype $1 |
||
| 342 | ;; |
||
| 343 | dmuprefetch) |
||
| 344 | dmuprefetch $1 |
||
| 345 | ;; |
||
| 346 | utilization) |
||
| 347 | utilization $1 |
||
| 348 | ;; |
||
| 349 | l2utilization) |
||
| 350 | l2utilization $1 |
||
| 351 | ;; |
||
| 352 | l2efficiency) |
||
| 353 | l2efficiency $1 |
||
| 354 | ;; |
||
| 355 | esac |
