Projet

Général

Profil

Révision 7c3490ba

ID7c3490ba2b62dddaf642e75109a811a67dde20ae
Parent cb6c9595
Enfant 2fa45511

Ajouté par amichel il y a presque 11 ans

Trying to make this into a one file commit. :|

Voir les différences:

plugins/zfs/zfsonlinux_stats_
1
#!/bin/sh
2
# 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
ARC_HITS=`cat $ARCSTATS | grep ^hits | awk '{print $3}'`
33
ARC_MISSES=`cat $ARCSTATS | grep ^misses | awk '{print $3}'`
34

  
35
DEMAND_DATA_HITS=`cat $ARCSTATS | grep ^demand_data_hits | awk '{print $3}'`
36
DEMAND_DATA_MISSES=`cat $ARCSTATS | grep ^demand_data_misses | awk '{print $3}'`
37
DEMAND_METADATA_HITS=`cat $ARCSTATS | grep ^demand_metadata_hits | awk '{print $3}'`
38
DEMAND_METADATA_MISSES=`cat $ARCSTATS | grep ^demand_metadata_misses | awk '{print $3}'`
39

  
40
MFU_GHOST_HITS=`cat $ARCSTATS | grep ^mfu_ghost_hits | awk '{print $3}'`
41
MFU_HITS=`cat $ARCSTATS | grep ^mfu_hits | awk '{print $3}'`
42
MRU_GHOST_HITS=`cat $ARCSTATS | grep ^mru_ghost_hits | awk '{print $3}'`
43
MRU_HITS=`cat $ARCSTATS | grep ^mru_hits | awk '{print $3}'`
44

  
45
PREFETCH_DATA_HITS=`cat $ARCSTATS | grep ^prefetch_data_hits | awk '{print $3}'`
46
PREFETCH_DATA_MISSES=`cat $ARCSTATS | grep ^prefetch_data_misses | awk '{print $3}'`
47
PREFETCH_METADATA_HITS=`cat $ARCSTATS | grep ^prefetch_metadata_hits | awk '{print $3}'`
48
PREFETCH_METADATA_MISSES=`cat $ARCSTATS | grep ^prefetch_metadata_misses | awk '{print $3}'`
49

  
50
DMU_HITS=`cat $ZFETCHSTATS | grep ^hits | awk '{print $3}'`
51
DMU_MISSES=`cat $ZFETCHSTATS | grep ^misses | awk '{print $3}'`
52

  
53
SIZE=`cat $ARCSTATS | grep ^size | awk '{print $3}'`
54
MRU_SIZE=`cat $ARCSTATS | grep ^p\  | awk '{print $3}'`
55
MAX_SIZE=`cat $ARCSTATS | grep ^c_max | awk '{print $3}'`
56
MIN_SIZE=`cat $ARCSTATS | grep ^c_min | awk '{print $3}'`
57
TARGET_SIZE=`cat $ARCSTATS | grep ^c\  | awk '{print $3}'`
58

  
59
L2_SIZE=`cat $ARCSTATS | grep ^l2_size | awk '{print $3}'`
60
L2_HDR_SIZE=`cat $ARCSTATS | grep ^l2_hdr_size | awk '{print $3}'`
61

  
62
L2_HITS=`cat $ARCSTATS | grep ^l2_hits | awk '{print $3}'`
63
L2_MISSES=`cat $ARCSTATS | grep ^l2_misses | awk '{print $3}'`
64

  
65
#
66
# Calculation macros
67
#
68

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

  
75
if [ $ARC_ACCESSES_TOTAL != 0 ]; then
76
	CACHE_HIT_RATIO_PERC=`echo "scale=2 ; (100*$ARC_HITS/$ARC_ACCESSES_TOTAL)" | $BC`
77
	CACHE_MISS_RATIO_PERC=`echo "scale=2 ; (100*$ARC_MISSES/$ARC_ACCESSES_TOTAL)" | $BC`
78
	ACTUAL_HIT_RATIO_PERC=`echo "scale=2 ; (100*$REAL_HITS/$ARC_ACCESSES_TOTAL)" | $BC`
79
else
80
	CACHE_HIT_RATIO_PERC=0
81
	CACHE_MISS_RATIO_PERC=0
82
	ACTUAL_HIT_RATIO_PERC=0
83
fi
84

  
85
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
86
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
87

  
88
if [ $ARC_HITS != 0 ]; then
89
	ANONYMOUSLY_USED_PERC=`echo "scale=2 ; (100*$ANON_HITS/$ARC_HITS)" | $BC`
90
	MOST_RECENTLY_USED_PERC=`echo "scale=2 ; (100*$MRU_HITS/$ARC_HITS)" | $BC`
91
	MOST_FREQUENTLY_USED_PERC=`echo "scale=2 ; (100*$MFU_HITS/$ARC_HITS)" | $BC`
92
	MOST_RECENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MRU_GHOST_HITS/$ARC_HITS)" | $BC`
93
	MOST_FREQUENTLY_USED_GHOST_PERC=`echo "scale=2 ; (100*$MFU_GHOST_HITS/$ARC_HITS)" | $BC`
94

  
95
	DEMAND_DATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_HITS/$ARC_HITS)" | $BC`
96
	PREFETCH_DATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_HITS/$ARC_HITS)" | $BC`
97
	DEMAND_METADATA_HIT_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_HITS/$ARC_HITS)" | $BC`
98
	PREFETCH_METADATA_HIT_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_HITS/$ARC_HITS)" | $BC`
99
else
100
	ANONYMOUSLY_USED_PERC=0
101
	MOST_RECENTLY_USED_PERC=0
102
	MOST_FREQUENTLY_USED_PERC=0
103
	MOST_RECENTLY_USED_GHOST_PERC=0
104
	MOST_FREQUENTLY_USED_GHOST_PERC=0
105

  
106
	DEMAND_DATA_HIT_PERC=0
107
	PREFETCH_DATA_HIT_PERC=0
108
	DEMAND_METADATA_HIT_PERC=0
109
	PREFETCH_METADATA_HIT_PERC=0
110
fi
111

  
112
if [ $ARC_MISSES != 0 ]; then
113
	PREFETCH_METADATA_MISSES_PERC=`echo "scale=2 ; (100*$PREFETCH_METADATA_MISSES/$ARC_MISSES)" | $BC`
114
	DEMAND_DATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_DATA_MISSES/$ARC_MISSES)" | $BC`
115
	PREFETCH_DATA_MISS_PERC=`echo "scale=2 ; (100*$PREFETCH_DATA_MISSES/$ARC_MISSES)" | $BC`
116
	DEMAND_METADATA_MISS_PERC=`echo "scale=2 ; (100*$DEMAND_METADATA_MISSES/$ARC_MISSES)" | $BC`
117
else
118
	PREFETCH_METADATA_MISSES_PERC=0
119
	DEMAND_DATA_MISS_PERC=0
120
	PREFETCH_DATA_MISS_PERC=0
121
	DEMAND_METADATA_MISS_PERC=0
122
fi
123

  
124
DMU_TOTAL=`echo "$DMU_HITS+$DMU_MISSES" | $BC`
125
if [ $DMU_TOTAL != 0 ]; then
126
	DMU_HITS_PERC=`echo "scale=2 ; (100*$DMU_HITS/$DMU_TOTAL)" | $BC`
127
	DMU_MISSES_PERC=`echo "scale=2 ; (100*$DMU_MISSES/$DMU_TOTAL)" | $BC`
128
else
129
	DMU_HITS_PERC=0
130
	DMU_MISSES_PERC=0
131
fi
132

  
133
if [ $SIZE -gt $TARGET_SIZE ]; then
134
	MFU_SIZE=`echo "$SIZE-$MRU_SIZE" | $BC`
135
else
136
	MFU_SIZE=`echo "$TARGET_SIZE-$MRU_SIZE" | $BC`
137
fi
138

  
139
L2_ACCESSES_TOTAL=`echo "$L2_HITS+$L2_MISSES" | $BC`
140
if [ $L2_ACCESSES_TOTAL -gt 0 ]; then
141
	L2_HIT_RATIO_PERC=`echo "scale=2 ; (100*$L2_HITS/$L2_ACCESSES_TOTAL)" | $BC`
142
	L2_MISS_RATIO_PERC=`echo "scale=2 ; (100*$L2_MISSES/$L2_ACCESSES_TOTAL)" | $BC`
143
else
144
	L2_HIT_RATIO_PERC=0
145
	L2_MISS_RATIO_PERC=0
146
fi
147

  
148
efficiency() {
149
        if [ "$1" = "config" ]; then
150
                echo 'graph_title ZFS ARC Efficiency'
151
                echo 'graph_args -u 100'
152
                echo 'graph_vlabel %'
153
                echo 'graph_info This graph shows the ARC Efficiency'
154

  
155
                echo 'hits.label Hit Ratio'
156
                echo 'misses.label Miss Ratio'
157
                echo 'actual_hits.label Actual Hit Ratio'
158
                echo 'data_demand_efficiency.label Data Demand Efficiency'
159
                echo 'data_prefetch_efficiency.label Data Prefetch Efficiency'
160

  
161
		exit 0
162
        else
163
                echo 'hits.value ' $CACHE_HIT_RATIO_PERC
164
                echo 'misses.value ' $CACHE_MISS_RATIO_PERC
165
                echo 'actual_hits.value ' $ACTUAL_HIT_RATIO_PERC
166
                echo 'data_demand_efficiency.value ' $DATA_DEMAND_EFFICIENCY_PERC
167
                echo 'data_prefetch_efficiency.value ' $DATA_PREFETCH_EFFICENCY_PERC
168
        fi
169
}
170

  
171
cachehitlist() {
172
        if [ "$1" = "config" ]; then
173
                echo 'graph_title ZFS ARC Efficiency: Cache hits by cache list'
174
                echo 'graph_args -u 100'
175
                echo 'graph_vlabel %'
176
                echo 'graph_info This graph shows the ARC Efficiency'
177

  
178
                echo 'cache_list_anon.label Anonymously Used'
179
                echo 'cache_list_most_rec.label Most Recently Used'
180
                echo 'cache_list_most_freq.label Most Frequently Used'
181
                echo 'cache_list_most_rec_ghost.label Most Recently Used Ghost'
182
                echo 'cache_list_most_freq_ghost.label Most Frequently Used Ghost'
183

  
184
		exit 0
185
	else
186
                echo 'cache_list_anon.value ' $ANONYMOUSLY_USED_PERC
187
                echo 'cache_list_most_rec.value ' $MOST_RECENTLY_USED_PERC
188
                echo 'cache_list_most_freq.value ' $MOST_FREQUENTLY_USED_PERC
189
                echo 'cache_list_most_rec_ghost.value ' $MOST_RECENTLY_USED_GHOST_PERC
190
                echo 'cache_list_most_freq_ghost.value ' $MOST_FREQUENTLY_USED_GHOST_PERC
191
	fi
192
}
193

  
194
cachehitdtype() {
195
        if [ "$1" = "config" ]; then
196
                echo 'graph_title ZFS ARC Efficiency: Cache hits by data type'
197
                echo 'graph_args -u 100'
198
                echo 'graph_vlabel %'
199
                echo 'graph_info This graph shows the ARC Efficiency'
200

  
201
                echo 'data_type_demand_hits.label Demand Data Hit Ratio'
202
                echo 'data_type_demand_misses.label Demand Data Miss Ratio'
203
                echo 'data_type_prefetch_hits.label Prefetch Data Hit Ratio'
204
                echo 'data_type_prefetch_misses.label Prefetch Data Miss Ratio'
205
                echo 'data_type_demand_metadata_hits.label Demand Metadata Hit Ratio'
206
                echo 'data_type_demand_metadata_misses.label Demand Metadata Miss Ratio'
207
                echo 'data_type_prefetch_metadata_hits.label Prefetch Metadata Hit Ratio'
208
                echo 'data_type_prefetch_metadata_misses.label Prefetch Metadata Miss Ratio'
209

  
210
		exit 0
211
	else
212
                echo 'data_type_demand_hits.value ' $DEMAND_DATA_HIT_PERC
213
                echo 'data_type_demand_misses.value ' $DEMAND_DATA_MISS_PERC
214
                echo 'data_type_prefetch_hits.value ' $PREFETCH_DATA_HIT_PERC
215
                echo 'data_type_prefetch_misses.value ' $PREFETCH_DATA_MISS_PERC
216
                echo 'data_type_demand_metadata_hits.value ' $DEMAND_METADATA_HIT_PERC
217
                echo 'data_type_demand_metadata_misses.value ' $DEMAND_METADATA_MISS_PERC
218
                echo 'data_type_prefetch_metadata_hits.value ' $PREFETCH_METADATA_HIT_PERC
219
                echo 'data_type_prefetch_metadata_misses.value ' $PREFETCH_METADATA_MISSES_PERC
220
	fi
221
}
222

  
223
dmuprefetch() {
224
        if [ "$1" = "config" ]; then
225
                echo 'graph_title ZFS DMU prefetch stats'
226
                echo 'graph_args -u 100'
227
                echo 'graph_vlabel %'
228
                echo 'graph_info This graph shows the DMU prefetch stats'
229

  
230
		echo 'hits.label Hit Ratio'
231
		echo 'misses.label Miss Ratio'
232

  
233
		exit 0
234
	else
235
		echo 'hits.value ' $DMU_HITS_PERC
236
		echo 'misses.value ' $DMU_MISSES_PERC
237
	fi
238
}
239

  
240
utilization() {
241
        if [ "$1" = "config" ]; then
242
                echo 'graph_title ZFS ARC Size'
243
                echo 'graph_args --base 1024 -l 0 --vertical-label Bytes --upper-limit '$MEMMAX
244
                echo 'graph_vlabel Size in MB'
245
                echo 'graph_info This graph shows the ARC Size utilization'
246

  
247
                echo 'max_size.label Maximum Size'
248
		echo 'max_size.draw AREA'
249
                echo 'size.label Size'
250
                echo 'size.draw AREA'
251
                echo 'min_size.label Minimum Size'
252
                echo 'min_size.draw AREA'
253
                echo 'target_size.label Target Size'
254
                echo 'target_size.draw LINE1'
255
		echo 'recently_size.label Recently Used Cache Size'
256
		echo 'recently_size.draw LINE1'
257
		echo 'frequently_size.label Frequently Used Cache Size'
258
		echo 'frequently_size.draw LINE1'
259

  
260
		exit 0
261
	else
262
                echo 'max_size.value ' $MAX_SIZE
263
		echo 'size.value ' $SIZE
264
                echo 'min_size.value ' $MIN_SIZE
265
                echo 'target_size.value ' $TARGET_SIZE
266
		echo 'recently_size.value ' $MRU_SIZE
267
		echo 'frequently_size.value ' $MFU_SIZE
268
	fi
269
}
270

  
271
l2utilization() {
272
        if [ "$1" = "config" ]; then
273
                echo 'graph_title ZFS L2ARC Size'
274
                echo 'graph_args --base 1024 -r -l 0 --vertical-label Bytes'
275
                echo 'graph_vlabel Size in MB'
276
                echo 'graph_info This graph shows the L2ARC Size utilization'
277

  
278
                echo 'size.label Size'
279
                echo 'size.draw AREA'
280
                echo 'hdr_size.label Header Size'
281
                echo 'hdr_size.draw AREA'
282

  
283
                exit 0
284
        else
285
                echo 'size.value ' $L2_SIZE
286
                echo 'hdr_size.value ' $L2_HDR_SIZE
287
        fi
288
}
289

  
290
l2efficiency() {
291
	if [ "$1" = "config" ]; then
292
		echo 'graph_title ZFS L2ARC Efficiency'
293
                echo 'graph_args -u 100'
294
                echo 'graph_vlabel %'
295
                echo 'graph_info This graph shows the L2ARC Efficiency'
296

  
297
		echo 'l2_hits.label Hit Ratio'
298
		echo 'l2_misses.label Miss Ratio'
299
	else
300
		echo 'l2_hits.value ' $L2_HIT_RATIO_PERC
301
		echo 'l2_misses.value ' $L2_MISS_RATIO_PERC
302
	fi
303

  
304
}
305

  
306
[ "$1" = "config" ] && echo "graph_category filesystem"
307

  
308
case "$FUNCTION" in
309
        efficiency)
310
                efficiency $1
311
                ;;
312
        cachehitlist)
313
                cachehitlist $1
314
                ;;
315
        cachehitdtype)
316
                cachehitdtype $1
317
                ;;
318
        dmuprefetch)
319
                dmuprefetch $1
320
                ;;
321
        utilization)
322
                utilization $1
323
                ;;
324
	l2utilization)
325
		l2utilization $1
326
		;;
327
	l2efficiency)
328
		l2efficiency $1
329
		;;
330
esac

Formats disponibles : Unified diff