Projet

Général

Profil

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

root / plugins / zfs / zfs_stats_ @ ef960abc

Historique | Voir | Annoter | Télécharger (11,3 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
#	l2utilization - L2ARC size breakdown
22
#	l2efficiency - L2ARC efficiency
23
#
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
L2_SIZE=`$SYS kstat.zfs.misc.arcstats.l2_size`
65
L2_HDR_SIZE=`$SYS kstat.zfs.misc.arcstats.l2_hdr_size`
66

    
67
L2_HITS=`$SYS kstat.zfs.misc.arcstats.l2_hits`
68
L2_MISSES=`$SYS kstat.zfs.misc.arcstats.l2_misses`
69

    
70
#
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
DEMAND_DATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_MISSES/$ARC_MISSES)" | $BC`
94
PREFETCH_DATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$ARC_HITS)" | $BC`
95
PREFETCH_DATA_MISS_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_MISSES/$ARC_MISSES)" | $BC`
96
DEMAND_METADATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_HITS/$ARC_HITS)" | $BC`
97
DEMAND_METADATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_MISSES/$ARC_MISSES)" | $BC`
98
PREFETCH_METADATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_HITS/$ARC_HITS)" | $BC`
99
PREFETCH_METADATA_MISSES_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_MISSES/$ARC_MISSES)" | $BC`
100

    
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
L2_ACCESSES_TOTAL=`echo "$L2_HITS+$L2_MISSES" | $BC`
112
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

    
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
                echo 'hits.label Hit Ratio'
125
                echo 'misses.label Miss Ratio'
126
                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
		echo 'hits.label Hit Ratio'
200
		echo 'misses.label Miss Ratio'
201

    
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
                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
		echo 'recently_size.label Recently Used Cache Size'
225
		echo 'recently_size.draw LINE1'
226
		echo 'frequently_size.label Frequently Used Cache Size'
227
		echo 'frequently_size.draw LINE1'
228

    
229
		exit 0
230
	else
231
                echo 'max_size.value ' $MAX_SIZE
232
		echo 'size.value ' $SIZE
233
                echo 'min_size.value ' $MIN_SIZE
234
                echo 'target_size.value ' $TARGET_SIZE
235
		echo 'recently_size.value ' $MRU_SIZE
236
		echo 'frequently_size.value ' $MFU_SIZE
237
	fi
238
}
239

    
240
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
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
[ "$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
	l2utilization)
294
		l2utilization $1
295
		;;
296
	l2efficiency)
297
		l2efficiency $1
298
		;;
299
esac