root / plugins / zfs / zfs_stats_ @ ef960abc
Historique | Voir | Annoter | Télécharger (11,3 ko)
| 1 | b1869d13 | David Bjornsson | #!/bin/sh |
|---|---|---|---|
| 2 | # ZFS statistics for FreeBSD |
||
| 3 | # Author: David Bjornsson <dabb@lolnet.is> |
||
| 4 | # |
||
| 5 | # Description: |
||
| 6 | # This is a rewrite of the zfs-stats-for-freebsd |
||
| 7 | # scripts by patpro. Rather then pulling the |
||
| 8 | # information from the zfs-stats utility, it |
||
| 9 | # pulls it straight from sysctl. |
||
| 10 | # |
||
| 11 | # Tested on FreeBSD 9.0-RELEASE |
||
| 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 | cbe45534 | David Bjornsson | # l2utilization - L2ARC size breakdown |
| 22 | # l2efficiency - L2ARC efficiency |
||
| 23 | b1869d13 | David Bjornsson | # |
| 24 | #%# family=auto |
||
| 25 | |||
| 26 | FUNCTION=$(basename $0 | cut -d_ -f3) |
||
| 27 | PAGESIZE=`/sbin/sysctl -n vm.stats.vm.v_page_size` |
||
| 28 | MEMSIZE=`/sbin/sysctl -n vm.stats.vm.v_page_count` |
||
| 29 | MEMMAX=`echo 'scale=2;' $PAGESIZE*$MEMSIZE | /usr/bin/bc -q` |
||
| 30 | BC='/usr/bin/bc -q' |
||
| 31 | SYS='/sbin/sysctl -n' |
||
| 32 | |||
| 33 | # |
||
| 34 | # Sysctl macros |
||
| 35 | # |
||
| 36 | |||
| 37 | ARC_HITS=`$SYS kstat.zfs.misc.arcstats.hits` |
||
| 38 | ARC_MISSES=`$SYS kstat.zfs.misc.arcstats.misses` |
||
| 39 | |||
| 40 | DEMAND_DATA_HITS=`$SYS kstat.zfs.misc.arcstats.demand_data_hits` |
||
| 41 | DEMAND_DATA_MISSES=`$SYS kstat.zfs.misc.arcstats.demand_data_misses` |
||
| 42 | DEMAND_METADATA_HITS=`$SYS kstat.zfs.misc.arcstats.demand_metadata_hits` |
||
| 43 | DEMAND_METADATA_MISSES=`$SYS kstat.zfs.misc.arcstats.demand_metadata_misses` |
||
| 44 | |||
| 45 | MFU_GHOST_HITS=`$SYS kstat.zfs.misc.arcstats.mfu_ghost_hits` |
||
| 46 | MFU_HITS=`$SYS kstat.zfs.misc.arcstats.mfu_hits` |
||
| 47 | MRU_GHOST_HITS=`$SYS kstat.zfs.misc.arcstats.mru_ghost_hits` |
||
| 48 | MRU_HITS=`$SYS kstat.zfs.misc.arcstats.mru_hits` |
||
| 49 | |||
| 50 | PREFETCH_DATA_HITS=`$SYS kstat.zfs.misc.arcstats.prefetch_data_hits` |
||
| 51 | PREFETCH_DATA_MISSES=`$SYS kstat.zfs.misc.arcstats.prefetch_data_misses` |
||
| 52 | PREFETCH_METADATA_HITS=`$SYS kstat.zfs.misc.arcstats.prefetch_metadata_hits` |
||
| 53 | PREFETCH_METADATA_MISSES=`$SYS kstat.zfs.misc.arcstats.prefetch_metadata_misses` |
||
| 54 | |||
| 55 | DMU_HITS=`$SYS kstat.zfs.misc.zfetchstats.hits` |
||
| 56 | DMU_MISSES=`$SYS kstat.zfs.misc.zfetchstats.misses` |
||
| 57 | |||
| 58 | SIZE=`$SYS kstat.zfs.misc.arcstats.size` |
||
| 59 | MRU_SIZE=`$SYS kstat.zfs.misc.arcstats.p` |
||
| 60 | MAX_SIZE=`$SYS kstat.zfs.misc.arcstats.c_max` |
||
| 61 | MIN_SIZE=`$SYS kstat.zfs.misc.arcstats.c_min` |
||
| 62 | TARGET_SIZE=`$SYS kstat.zfs.misc.arcstats.c` |
||
| 63 | |||
| 64 | 20cc0e04 | dabb | L2_SIZE=`$SYS kstat.zfs.misc.arcstats.l2_size` |
| 65 | L2_HDR_SIZE=`$SYS kstat.zfs.misc.arcstats.l2_hdr_size` |
||
| 66 | b1869d13 | David Bjornsson | |
| 67 | cbe45534 | David Bjornsson | L2_HITS=`$SYS kstat.zfs.misc.arcstats.l2_hits` |
| 68 | L2_MISSES=`$SYS kstat.zfs.misc.arcstats.l2_misses` |
||
| 69 | |||
| 70 | b1869d13 | David Bjornsson | # |
| 71 | # Calculation macros |
||
| 72 | # |
||
| 73 | |||
| 74 | ANON_HITS=`echo "$ARC_HITS-($MFU_HITS+$MRU_HITS+$MFU_GHOST_HITS+$MRU_GHOST_HITS)" | $BC` |
||
| 75 | ARC_ACCESSES_TOTAL=`echo "$ARC_HITS+$ARC_MISSES" | $BC` |
||
| 76 | DEMAND_DATA_TOTAL=`echo "$DEMAND_DATA_HITS+$DEMAND_DATA_MISSES" | $BC` |
||
| 77 | PREFETCH_DATA_TOTAL=`echo "$PREFETCH_DATA_HITS+$PREFETCH_DATA_MISSES" | $BC` |
||
| 78 | REAL_HITS=`echo "$MFU_HITS+$MRU_HITS" | $BC` |
||
| 79 | |||
| 80 | CACHE_HIT_RATIO_PERC=`echo "scale=2 ; (100*$ARC_HITS/$ARC_ACCESSES_TOTAL)" | $BC` |
||
| 81 | CACHE_MISS_RATIO_PERC=`echo "scale=2 ; (100*$ARC_MISSES/$ARC_ACCESSES_TOTAL)" | $BC` |
||
| 82 | ACTUAL_HIT_RATIO_PERC=`echo "scale=2 ; (100*$REAL_HITS/$ARC_ACCESSES_TOTAL)" | $BC` |
||
| 83 | DATA_DEMAND_EFFICIENCY_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_HITS/$DEMAND_DATA_TOTAL)" | $BC` |
||
| 84 | DATA_PREFETCH_EFFICENCY_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$PREFETCH_DATA_TOTAL)" | $BC` |
||
| 85 | |||
| 86 | ANONYMOUSLY_USED_PERC=`echo "scale=2 ; (100*$ANON_HITS/$ARC_HITS)" | $BC` |
||
| 87 | MOST_RECENTLY_USED_PERC=`echo "scale=2 ; (100*$MRU_HITS/$ARC_HITS)" | $BC` |
||
| 88 | MOST_FREQUENTLY_USED_PERC=`echo "scale=2 ; (100*$MFU_HITS/$ARC_HITS)" | $BC` |
||
| 89 | MOST_RECENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MRU_GHOST_HITS/$ARC_HITS)" | $BC` |
||
| 90 | MOST_FREQUENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MFU_GHOST_HITS/$ARC_HITS)" | $BC` |
||
| 91 | |||
| 92 | DEMAND_DATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_HITS/$ARC_HITS)" | $BC` |
||
| 93 | 83159620 | dabb | DEMAND_DATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_MISSES/$ARC_MISSES)" | $BC` |
| 94 | b1869d13 | David Bjornsson | PREFETCH_DATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$ARC_HITS)" | $BC` |
| 95 | 83159620 | dabb | PREFETCH_DATA_MISS_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_MISSES/$ARC_MISSES)" | $BC` |
| 96 | b1869d13 | David Bjornsson | DEMAND_METADATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_HITS/$ARC_HITS)" | $BC` |
| 97 | 83159620 | dabb | DEMAND_METADATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_MISSES/$ARC_MISSES)" | $BC` |
| 98 | b1869d13 | David Bjornsson | PREFETCH_METADATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_HITS/$ARC_HITS)" | $BC` |
| 99 | 83159620 | dabb | PREFETCH_METADATA_MISSES_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_MISSES/$ARC_MISSES)" | $BC` |
| 100 | b1869d13 | David Bjornsson | |
| 101 | DMU_TOTAL=`echo "$DMU_HITS+$DMU_MISSES" | $BC` |
||
| 102 | DMU_HITS_PERC=`echo "scale=2 ; (100*$DMU_HITS/$DMU_TOTAL)" | $BC` |
||
| 103 | DMU_MISSES_PERC=`echo "scale=2 ; (100*$DMU_MISSES/$DMU_TOTAL)" | $BC` |
||
| 104 | |||
| 105 | if [ $SIZE -gt $TARGET_SIZE ]; then |
||
| 106 | MFU_SIZE=`echo "$SIZE-$MRU_SIZE" | $BC` |
||
| 107 | else |
||
| 108 | MFU_SIZE=`echo "$TARGET_SIZE-$MRU_SIZE" | $BC` |
||
| 109 | fi |
||
| 110 | |||
| 111 | cbe45534 | David Bjornsson | L2_ACCESSES_TOTAL=`echo "$L2_HITS+$L2_MISSES" | $BC` |
| 112 | c26049e8 | Claudius Herder | if [ $L2_ACCESSES_TOTAL -gt 0 ]; then |
| 113 | L2_HIT_RATIO_PERC=`echo "scale=2 ; (100*$L2_HITS/$L2_ACCESSES_TOTAL)" | $BC` |
||
| 114 | L2_MISS_RATIO_PERC=`echo "scale=2 ; (100*$L2_MISSES/$L2_ACCESSES_TOTAL)" | $BC` |
||
| 115 | fi |
||
| 116 | b1869d13 | David Bjornsson | |
| 117 | efficiency() {
|
||
| 118 | if [ "$1" = "config" ]; then |
||
| 119 | echo 'graph_title ZFS ARC Efficiency' |
||
| 120 | echo 'graph_args -u 100' |
||
| 121 | echo 'graph_vlabel %' |
||
| 122 | echo 'graph_info This graph shows the ARC Efficiency' |
||
| 123 | |||
| 124 | cbe45534 | David Bjornsson | echo 'hits.label Hit Ratio' |
| 125 | echo 'misses.label Miss Ratio' |
||
| 126 | b1869d13 | David Bjornsson | echo 'actual_hits.label Actual Hit Ratio' |
| 127 | echo 'data_demand_efficiency.label Data Demand Efficiency' |
||
| 128 | echo 'data_prefetch_efficiency.label Data Prefetch Efficiency' |
||
| 129 | |||
| 130 | exit 0 |
||
| 131 | else |
||
| 132 | echo 'hits.value ' $CACHE_HIT_RATIO_PERC |
||
| 133 | echo 'misses.value ' $CACHE_MISS_RATIO_PERC |
||
| 134 | echo 'actual_hits.value ' $ACTUAL_HIT_RATIO_PERC |
||
| 135 | echo 'data_demand_efficiency.value ' $DATA_DEMAND_EFFICIENCY_PERC |
||
| 136 | echo 'data_prefetch_efficiency.value ' $DATA_PREFETCH_EFFICENCY_PERC |
||
| 137 | fi |
||
| 138 | } |
||
| 139 | |||
| 140 | cachehitlist() {
|
||
| 141 | if [ "$1" = "config" ]; then |
||
| 142 | echo 'graph_title ZFS ARC Efficiency: Cache hits by cache list' |
||
| 143 | echo 'graph_args -u 100' |
||
| 144 | echo 'graph_vlabel %' |
||
| 145 | echo 'graph_info This graph shows the ARC Efficiency' |
||
| 146 | |||
| 147 | echo 'cache_list_anon.label Anonymously Used' |
||
| 148 | echo 'cache_list_most_rec.label Most Recently Used' |
||
| 149 | echo 'cache_list_most_freq.label Most Frequently Used' |
||
| 150 | echo 'cache_list_most_rec_ghost.label Most Recently Used Ghost' |
||
| 151 | echo 'cache_list_most_freq_ghost.label Most Frequently Used Ghost' |
||
| 152 | |||
| 153 | exit 0 |
||
| 154 | else |
||
| 155 | echo 'cache_list_anon.value ' $ANONYMOUSLY_USED_PERC |
||
| 156 | echo 'cache_list_most_rec.value ' $MOST_RECENTLY_USED_PERC |
||
| 157 | echo 'cache_list_most_freq.value ' $MOST_FREQUENTLY_USED_PERC |
||
| 158 | echo 'cache_list_most_rec_ghost.value ' $MOST_RECENTLY_USED_GHOST_PERC |
||
| 159 | echo 'cache_list_most_freq_ghost.value ' $MOST_FREQUENTLY_USED_GHOST_PERC |
||
| 160 | fi |
||
| 161 | } |
||
| 162 | |||
| 163 | cachehitdtype() {
|
||
| 164 | if [ "$1" = "config" ]; then |
||
| 165 | echo 'graph_title ZFS ARC Efficiency: Cache hits by data type' |
||
| 166 | echo 'graph_args -u 100' |
||
| 167 | echo 'graph_vlabel %' |
||
| 168 | echo 'graph_info This graph shows the ARC Efficiency' |
||
| 169 | |||
| 170 | echo 'data_type_demand_hits.label Demand Data Hit Ratio' |
||
| 171 | echo 'data_type_demand_misses.label Demand Data Miss Ratio' |
||
| 172 | echo 'data_type_prefetch_hits.label Prefetch Data Hit Ratio' |
||
| 173 | echo 'data_type_prefetch_misses.label Prefetch Data Miss Ratio' |
||
| 174 | echo 'data_type_demand_metadata_hits.label Demand Metadata Hit Ratio' |
||
| 175 | echo 'data_type_demand_metadata_misses.label Demand Metadata Miss Ratio' |
||
| 176 | echo 'data_type_prefetch_metadata_hits.label Prefetch Metadata Hit Ratio' |
||
| 177 | echo 'data_type_prefetch_metadata_misses.label Prefetch Metadata Miss Ratio' |
||
| 178 | |||
| 179 | exit 0 |
||
| 180 | else |
||
| 181 | echo 'data_type_demand_hits.value ' $DEMAND_DATA_HIT_PERC |
||
| 182 | echo 'data_type_demand_misses.value ' $DEMAND_DATA_MISS_PERC |
||
| 183 | echo 'data_type_prefetch_hits.value ' $PREFETCH_DATA_HIT_PERC |
||
| 184 | echo 'data_type_prefetch_misses.value ' $PREFETCH_DATA_MISS_PERC |
||
| 185 | echo 'data_type_demand_metadata_hits.value ' $DEMAND_METADATA_HIT_PERC |
||
| 186 | echo 'data_type_demand_metadata_misses.value ' $DEMAND_METADATA_MISS_PERC |
||
| 187 | echo 'data_type_prefetch_metadata_hits.value ' $PREFETCH_METADATA_HIT_PERC |
||
| 188 | echo 'data_type_prefetch_metadata_misses.value ' $PREFETCH_METADATA_MISSES_PERC |
||
| 189 | fi |
||
| 190 | } |
||
| 191 | |||
| 192 | dmuprefetch() {
|
||
| 193 | if [ "$1" = "config" ]; then |
||
| 194 | echo 'graph_title ZFS DMU prefetch stats' |
||
| 195 | echo 'graph_args -u 100' |
||
| 196 | echo 'graph_vlabel %' |
||
| 197 | echo 'graph_info This graph shows the DMU prefetch stats' |
||
| 198 | |||
| 199 | cbe45534 | David Bjornsson | echo 'hits.label Hit Ratio' |
| 200 | echo 'misses.label Miss Ratio' |
||
| 201 | b1869d13 | David Bjornsson | |
| 202 | exit 0 |
||
| 203 | else |
||
| 204 | echo 'hits.value ' $DMU_HITS_PERC |
||
| 205 | echo 'misses.value ' $DMU_MISSES_PERC |
||
| 206 | fi |
||
| 207 | } |
||
| 208 | |||
| 209 | utilization() {
|
||
| 210 | if [ "$1" = "config" ]; then |
||
| 211 | echo 'graph_title ZFS ARC Size' |
||
| 212 | echo 'graph_args --base 1024 -l 0 --vertical-label Bytes --upper-limit '$MEMMAX |
||
| 213 | echo 'graph_vlabel Size in MB' |
||
| 214 | echo 'graph_info This graph shows the ARC Size utilization' |
||
| 215 | |||
| 216 | echo 'max_size.label Maximum Size' |
||
| 217 | echo 'max_size.draw AREA' |
||
| 218 | echo 'size.label Size' |
||
| 219 | echo 'size.draw AREA' |
||
| 220 | 336ca2a9 | David Bjornsson | echo 'min_size.label Minimum Size' |
| 221 | echo 'min_size.draw AREA' |
||
| 222 | echo 'target_size.label Target Size' |
||
| 223 | echo 'target_size.draw LINE1' |
||
| 224 | b1869d13 | David Bjornsson | echo 'recently_size.label Recently Used Cache Size' |
| 225 | 336ca2a9 | David Bjornsson | echo 'recently_size.draw LINE1' |
| 226 | b1869d13 | David Bjornsson | echo 'frequently_size.label Frequently Used Cache Size' |
| 227 | 336ca2a9 | David Bjornsson | echo 'frequently_size.draw LINE1' |
| 228 | b1869d13 | David Bjornsson | |
| 229 | exit 0 |
||
| 230 | else |
||
| 231 | echo 'max_size.value ' $MAX_SIZE |
||
| 232 | echo 'size.value ' $SIZE |
||
| 233 | 336ca2a9 | David Bjornsson | echo 'min_size.value ' $MIN_SIZE |
| 234 | echo 'target_size.value ' $TARGET_SIZE |
||
| 235 | b1869d13 | David Bjornsson | echo 'recently_size.value ' $MRU_SIZE |
| 236 | echo 'frequently_size.value ' $MFU_SIZE |
||
| 237 | fi |
||
| 238 | } |
||
| 239 | |||
| 240 | 20cc0e04 | dabb | l2utilization() {
|
| 241 | if [ "$1" = "config" ]; then |
||
| 242 | echo 'graph_title ZFS L2ARC Size' |
||
| 243 | echo 'graph_args --base 1024 -r -l 0 --vertical-label Bytes' |
||
| 244 | echo 'graph_vlabel Size in MB' |
||
| 245 | echo 'graph_info This graph shows the L2ARC Size utilization' |
||
| 246 | |||
| 247 | echo 'size.label Size' |
||
| 248 | echo 'size.draw AREA' |
||
| 249 | echo 'hdr_size.label Header Size' |
||
| 250 | echo 'hdr_size.draw AREA' |
||
| 251 | |||
| 252 | exit 0 |
||
| 253 | else |
||
| 254 | echo 'size.value ' $L2_SIZE |
||
| 255 | echo 'hdr_size.value ' $L2_HDR_SIZE |
||
| 256 | fi |
||
| 257 | } |
||
| 258 | |||
| 259 | cbe45534 | David Bjornsson | l2efficiency() {
|
| 260 | if [ "$1" = "config" ]; then |
||
| 261 | echo 'graph_title ZFS L2ARC Efficiency' |
||
| 262 | echo 'graph_args -u 100' |
||
| 263 | echo 'graph_vlabel %' |
||
| 264 | echo 'graph_info This graph shows the L2ARC Efficiency' |
||
| 265 | |||
| 266 | echo 'l2_hits.label Hit Ratio' |
||
| 267 | echo 'l2_misses.label Miss Ratio' |
||
| 268 | else |
||
| 269 | echo 'l2_hits.value ' $L2_HIT_RATIO_PERC |
||
| 270 | echo 'l2_misses.value ' $L2_MISS_RATIO_PERC |
||
| 271 | fi |
||
| 272 | |||
| 273 | } |
||
| 274 | |||
| 275 | b1869d13 | David Bjornsson | [ "$1" = "config" ] && echo "graph_category zfs" |
| 276 | |||
| 277 | case "$FUNCTION" in |
||
| 278 | efficiency) |
||
| 279 | efficiency $1 |
||
| 280 | ;; |
||
| 281 | cachehitlist) |
||
| 282 | cachehitlist $1 |
||
| 283 | ;; |
||
| 284 | cachehitdtype) |
||
| 285 | cachehitdtype $1 |
||
| 286 | ;; |
||
| 287 | dmuprefetch) |
||
| 288 | dmuprefetch $1 |
||
| 289 | ;; |
||
| 290 | utilization) |
||
| 291 | utilization $1 |
||
| 292 | ;; |
||
| 293 | 20cc0e04 | dabb | l2utilization) |
| 294 | l2utilization $1 |
||
| 295 | ;; |
||
| 296 | cbe45534 | David Bjornsson | l2efficiency) |
| 297 | l2efficiency $1 |
||
| 298 | ;; |
||
| 299 | b1869d13 | David Bjornsson | esac |
