Projet

Général

Profil

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

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