Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / zfs / zfs_stats_ @ 83159620

Historique | Voir | Annoter | Télécharger (9,88 ko)

1
#!/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
#
22
#%# family=auto
23

    
24
FUNCTION=$(basename $0 | cut -d_ -f3)
25
PAGESIZE=`/sbin/sysctl -n vm.stats.vm.v_page_size`
26
MEMSIZE=`/sbin/sysctl -n vm.stats.vm.v_page_count`
27
MEMMAX=`echo 'scale=2;' $PAGESIZE*$MEMSIZE | /usr/bin/bc -q`
28
BC='/usr/bin/bc -q'
29
SYS='/sbin/sysctl -n'
30

    
31
#
32
# Sysctl macros
33
#
34

    
35
ARC_HITS=`$SYS kstat.zfs.misc.arcstats.hits`
36
ARC_MISSES=`$SYS kstat.zfs.misc.arcstats.misses`
37

    
38
DEMAND_DATA_HITS=`$SYS kstat.zfs.misc.arcstats.demand_data_hits`
39
DEMAND_DATA_MISSES=`$SYS kstat.zfs.misc.arcstats.demand_data_misses`
40
DEMAND_METADATA_HITS=`$SYS kstat.zfs.misc.arcstats.demand_metadata_hits`
41
DEMAND_METADATA_MISSES=`$SYS kstat.zfs.misc.arcstats.demand_metadata_misses`
42

    
43
MFU_GHOST_HITS=`$SYS kstat.zfs.misc.arcstats.mfu_ghost_hits`
44
MFU_HITS=`$SYS kstat.zfs.misc.arcstats.mfu_hits`
45
MRU_GHOST_HITS=`$SYS kstat.zfs.misc.arcstats.mru_ghost_hits`
46
MRU_HITS=`$SYS kstat.zfs.misc.arcstats.mru_hits`
47

    
48
PREFETCH_DATA_HITS=`$SYS kstat.zfs.misc.arcstats.prefetch_data_hits`
49
PREFETCH_DATA_MISSES=`$SYS kstat.zfs.misc.arcstats.prefetch_data_misses`
50
PREFETCH_METADATA_HITS=`$SYS kstat.zfs.misc.arcstats.prefetch_metadata_hits`
51
PREFETCH_METADATA_MISSES=`$SYS kstat.zfs.misc.arcstats.prefetch_metadata_misses`
52

    
53
DMU_HITS=`$SYS kstat.zfs.misc.zfetchstats.hits`
54
DMU_MISSES=`$SYS kstat.zfs.misc.zfetchstats.misses`
55

    
56
SIZE=`$SYS kstat.zfs.misc.arcstats.size`
57
MRU_SIZE=`$SYS kstat.zfs.misc.arcstats.p`
58
MAX_SIZE=`$SYS kstat.zfs.misc.arcstats.c_max`
59
MIN_SIZE=`$SYS kstat.zfs.misc.arcstats.c_min`
60
TARGET_SIZE=`$SYS kstat.zfs.misc.arcstats.c`
61

    
62

    
63
#
64
# Calculation macros
65
#
66

    
67
ANON_HITS=`echo "$ARC_HITS-($MFU_HITS+$MRU_HITS+$MFU_GHOST_HITS+$MRU_GHOST_HITS)" | $BC`
68
ARC_ACCESSES_TOTAL=`echo "$ARC_HITS+$ARC_MISSES" | $BC`
69
DEMAND_DATA_TOTAL=`echo "$DEMAND_DATA_HITS+$DEMAND_DATA_MISSES" | $BC`
70
PREFETCH_DATA_TOTAL=`echo "$PREFETCH_DATA_HITS+$PREFETCH_DATA_MISSES" | $BC`
71
REAL_HITS=`echo "$MFU_HITS+$MRU_HITS" | $BC`
72

    
73
CACHE_HIT_RATIO_PERC=`echo "scale=2 ; (100*$ARC_HITS/$ARC_ACCESSES_TOTAL)" | $BC`
74
CACHE_MISS_RATIO_PERC=`echo "scale=2 ; (100*$ARC_MISSES/$ARC_ACCESSES_TOTAL)" | $BC`
75
ACTUAL_HIT_RATIO_PERC=`echo "scale=2 ; (100*$REAL_HITS/$ARC_ACCESSES_TOTAL)" | $BC`
76
DATA_DEMAND_EFFICIENCY_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_HITS/$DEMAND_DATA_TOTAL)" | $BC`
77
DATA_PREFETCH_EFFICENCY_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$PREFETCH_DATA_TOTAL)" | $BC`
78

    
79
ANONYMOUSLY_USED_PERC=`echo "scale=2 ; (100*$ANON_HITS/$ARC_HITS)" | $BC`
80
MOST_RECENTLY_USED_PERC=`echo "scale=2 ; (100*$MRU_HITS/$ARC_HITS)" | $BC`
81
MOST_FREQUENTLY_USED_PERC=`echo "scale=2 ; (100*$MFU_HITS/$ARC_HITS)" | $BC`
82
MOST_RECENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MRU_GHOST_HITS/$ARC_HITS)" | $BC`
83
MOST_FREQUENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MFU_GHOST_HITS/$ARC_HITS)" | $BC`
84

    
85
DEMAND_DATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_HITS/$ARC_HITS)" | $BC`
86
DEMAND_DATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_MISSES/$ARC_MISSES)" | $BC`
87
PREFETCH_DATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$ARC_HITS)" | $BC`
88
PREFETCH_DATA_MISS_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_MISSES/$ARC_MISSES)" | $BC`
89
DEMAND_METADATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_HITS/$ARC_HITS)" | $BC`
90
DEMAND_METADATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_MISSES/$ARC_MISSES)" | $BC`
91
PREFETCH_METADATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_HITS/$ARC_HITS)" | $BC`
92
PREFETCH_METADATA_MISSES_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_MISSES/$ARC_MISSES)" | $BC`
93

    
94
DMU_TOTAL=`echo "$DMU_HITS+$DMU_MISSES" | $BC`
95
DMU_HITS_PERC=`echo "scale=2 ; (100*$DMU_HITS/$DMU_TOTAL)" | $BC`
96
DMU_MISSES_PERC=`echo "scale=2 ; (100*$DMU_MISSES/$DMU_TOTAL)" | $BC`
97

    
98
if [ $SIZE -gt $TARGET_SIZE ]; then
99
	MFU_SIZE=`echo "$SIZE-$MRU_SIZE" | $BC`
100
else
101
	MFU_SIZE=`echo "$TARGET_SIZE-$MRU_SIZE" | $BC`
102
fi
103

    
104

    
105
efficiency() {
106

    
107
        if [ "$1" = "config" ]; then
108
                echo 'graph_title ZFS ARC Efficiency'
109
                echo 'graph_args -u 100'
110
                echo 'graph_vlabel %'
111
                echo 'graph_category ZFS'
112
                echo 'graph_info This graph shows the ARC Efficiency'
113

    
114
                echo 'hits.label Cache Hit Ratio'
115
                echo 'misses.label Cache Miss Ratio'
116
                echo 'actual_hits.label Actual Hit Ratio'
117
                echo 'data_demand_efficiency.label Data Demand Efficiency'
118
                echo 'data_prefetch_efficiency.label Data Prefetch Efficiency'
119

    
120
		exit 0
121
        else
122
                echo 'hits.value ' $CACHE_HIT_RATIO_PERC
123
                echo 'misses.value ' $CACHE_MISS_RATIO_PERC
124
                echo 'actual_hits.value ' $ACTUAL_HIT_RATIO_PERC
125
                echo 'data_demand_efficiency.value ' $DATA_DEMAND_EFFICIENCY_PERC
126
                echo 'data_prefetch_efficiency.value ' $DATA_PREFETCH_EFFICENCY_PERC
127
        fi
128
}
129

    
130
cachehitlist() {
131
        if [ "$1" = "config" ]; then
132
                echo 'graph_title ZFS ARC Efficiency: Cache hits by cache list'
133
                echo 'graph_args -u 100'
134
                echo 'graph_vlabel %'
135
                echo 'graph_category ZFS'
136
                echo 'graph_info This graph shows the ARC Efficiency'
137

    
138
                echo 'cache_list_anon.label Anonymously Used'
139
                echo 'cache_list_most_rec.label Most Recently Used'
140
                echo 'cache_list_most_freq.label Most Frequently Used'
141
                echo 'cache_list_most_rec_ghost.label Most Recently Used Ghost'
142
                echo 'cache_list_most_freq_ghost.label Most Frequently Used Ghost'
143

    
144
		exit 0
145
	else
146
                echo 'cache_list_anon.value ' $ANONYMOUSLY_USED_PERC
147
                echo 'cache_list_most_rec.value ' $MOST_RECENTLY_USED_PERC
148
                echo 'cache_list_most_freq.value ' $MOST_FREQUENTLY_USED_PERC
149
                echo 'cache_list_most_rec_ghost.value ' $MOST_RECENTLY_USED_GHOST_PERC
150
                echo 'cache_list_most_freq_ghost.value ' $MOST_FREQUENTLY_USED_GHOST_PERC
151
	fi
152
}
153

    
154
cachehitdtype() {
155
        if [ "$1" = "config" ]; then
156
                echo 'graph_title ZFS ARC Efficiency: Cache hits by data type'
157
                echo 'graph_args -u 100'
158
                echo 'graph_vlabel %'
159
                echo 'graph_category ZFS'
160
                echo 'graph_info This graph shows the ARC Efficiency'
161

    
162
                echo 'data_type_demand_hits.label Demand Data Hit Ratio'
163
                echo 'data_type_demand_misses.label Demand Data Miss Ratio'
164
                echo 'data_type_prefetch_hits.label Prefetch Data Hit Ratio'
165
                echo 'data_type_prefetch_misses.label Prefetch Data Miss Ratio'
166
                echo 'data_type_demand_metadata_hits.label Demand Metadata Hit Ratio'
167
                echo 'data_type_demand_metadata_misses.label Demand Metadata Miss Ratio'
168
                echo 'data_type_prefetch_metadata_hits.label Prefetch Metadata Hit Ratio'
169
                echo 'data_type_prefetch_metadata_misses.label Prefetch Metadata Miss Ratio'
170

    
171
		exit 0
172
	else
173
                echo 'data_type_demand_hits.value ' $DEMAND_DATA_HIT_PERC
174
                echo 'data_type_demand_misses.value ' $DEMAND_DATA_MISS_PERC
175
                echo 'data_type_prefetch_hits.value ' $PREFETCH_DATA_HIT_PERC
176
                echo 'data_type_prefetch_misses.value ' $PREFETCH_DATA_MISS_PERC
177
                echo 'data_type_demand_metadata_hits.value ' $DEMAND_METADATA_HIT_PERC
178
                echo 'data_type_demand_metadata_misses.value ' $DEMAND_METADATA_MISS_PERC
179
                echo 'data_type_prefetch_metadata_hits.value ' $PREFETCH_METADATA_HIT_PERC
180
                echo 'data_type_prefetch_metadata_misses.value ' $PREFETCH_METADATA_MISSES_PERC
181
	fi
182
}
183

    
184
dmuprefetch() {
185

    
186
        if [ "$1" = "config" ]; then
187
                echo 'graph_title ZFS DMU prefetch stats'
188
                echo 'graph_args -u 100'
189
                echo 'graph_vlabel %'
190
                echo 'graph_category ZFS'
191
                echo 'graph_info This graph shows the DMU prefetch stats'
192

    
193
		echo 'hits.label Hit percentage'
194
		echo 'misses.label Miss percentage'
195

    
196
		exit 0
197
	else
198
		echo 'hits.value ' $DMU_HITS_PERC
199
		echo 'misses.value ' $DMU_MISSES_PERC
200
	fi
201
}
202

    
203
utilization() {
204

    
205
        if [ "$1" = "config" ]; then
206
                echo 'graph_title ZFS ARC Size'
207
                echo 'graph_args --base 1024 -l 0 --vertical-label Bytes --upper-limit '$MEMMAX
208
                echo 'graph_vlabel Size in MB'
209
                echo 'graph_category ZFS'
210
                echo 'graph_info This graph shows the ARC Size utilization'
211

    
212
                echo 'max_size.label Maximum Size'
213
		echo 'max_size.draw AREA'
214
		echo 'target_size.label Target Size'
215
		echo 'target_size.draw AREA'
216
                echo 'size.label Size'
217
                echo 'size.draw AREA'
218
		echo 'recently_size.label Recently Used Cache Size'
219
		echo 'recently_size.draw AREA'
220
		echo 'frequently_size.label Frequently Used Cache Size'
221
		echo 'frequently_size.draw AREA'
222
                echo 'min_size.label Minimum Size'
223
		echo 'min_size.draw AREA'
224

    
225
		exit 0
226
	else
227
                echo 'max_size.value ' $MAX_SIZE
228
		echo 'target_size.value ' $TARGET_SIZE
229
		echo 'size.value ' $SIZE
230
		echo 'recently_size.value ' $MRU_SIZE
231
		echo 'frequently_size.value ' $MFU_SIZE
232
		echo 'min_size.value ' $MIN_SIZE
233
	fi
234
}
235

    
236
[ "$1" = "config" ] && echo "graph_category zfs"
237

    
238
case "$FUNCTION" in
239
        efficiency)
240
                efficiency $1
241
                ;;
242
        cachehitlist)
243
                cachehitlist $1
244
                ;;
245
        cachehitdtype)
246
                cachehitdtype $1
247
                ;;
248
        dmuprefetch)
249
                dmuprefetch $1
250
                ;;
251
        utilization)
252
                utilization $1
253
                ;;
254
esac