]>
Commit | Line | Data |
---|---|---|
302ef151 BB |
1 | #!/bin/bash |
2 | # | |
3 | # Wrapper script for easily running a survey of zpios based tests | |
4 | # | |
5 | ||
6 | basedir="$(dirname $0)" | |
7 | ||
8 | SCRIPT_COMMON=common.sh | |
9 | if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then | |
10 | . "${basedir}/${SCRIPT_COMMON}" | |
11 | else | |
12 | echo "Missing helper script ${SCRIPT_COMMON}" && exit 1 | |
13 | fi | |
14 | ||
15 | PROG=zpios-survey.sh | |
16 | ||
17 | usage() { | |
18 | cat << EOF | |
19 | USAGE: | |
20 | $0 [hvp] <-c config> <-t test> | |
21 | ||
22 | DESCRIPTION: | |
23 | Helper script for easy zpios survey benchmarking. | |
24 | ||
25 | OPTIONS: | |
26 | -h Show this message | |
27 | -v Verbose | |
28 | -p Enable profiling | |
29 | -c Zpool configuration | |
30 | -t Zpios test | |
31 | -l Zpios survey log | |
32 | ||
33 | EOF | |
34 | } | |
35 | ||
36 | print_header() { | |
37 | tee -a ${ZPIOS_SURVEY_LOG} << EOF | |
38 | ||
39 | ================================================================ | |
40 | Test: $1 | |
41 | EOF | |
42 | } | |
43 | ||
44 | # Baseline performance for an out of the box config with no manual tuning. | |
45 | # Ideally, we want everything to be automatically tuned for your system and | |
46 | # for this to perform reasonably well. | |
47 | zpios_survey_base() { | |
48 | TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+baseline" | |
49 | print_header ${TEST_NAME} | |
50 | ||
51 | ${ZFS_SH} ${VERBOSE_FLAG} | \ | |
52 | tee -a ${ZPIOS_SURVEY_LOG} | |
53 | ${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} | \ | |
54 | tee -a ${ZPIOS_SURVEY_LOG} | |
55 | ${ZFS_SH} -u ${VERBOSE_FLAG} | \ | |
56 | tee -a ${ZPIOS_SURVEY_LOG} | |
57 | } | |
58 | ||
59 | # Disable ZFS's prefetching. For some reason still not clear to me | |
60 | # current prefetching policy is quite bad for a random workload. | |
61 | # Allowing the algorithm to detect a random workload and not do | |
62 | # anything may be the way to address this issue. | |
63 | zpios_survey_prefetch() { | |
64 | TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+prefetch" | |
65 | print_header ${TEST_NAME} | |
66 | ||
67 | ${ZFS_SH} ${VERBOSE_FLAG} \ | |
68 | tee -a ${ZPIOS_SURVEY_LOG} | |
69 | ${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \ | |
70 | -o "--noprefetch" | \ | |
71 | tee -a ${ZPIOS_SURVEY_LOG} | |
72 | ${ZFS_SH} -u ${VERBOSE_FLAG} | \ | |
73 | tee -a ${ZPIOS_SURVEY_LOG} | |
74 | } | |
75 | ||
76 | # Simulating a zerocopy IO path should improve performance by freeing up | |
77 | # lots of CPU which is wasted move data between buffers. | |
78 | zpios_survey_zerocopy() { | |
79 | TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+zerocopy" | |
80 | print_header ${TEST_NAME} | |
81 | ||
82 | ${ZFS_SH} ${VERBOSE_FLAG} | \ | |
83 | tee -a ${ZPIOS_SURVEY_LOG} | |
84 | ${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \ | |
85 | -o "--zerocopy" | \ | |
86 | tee -a ${ZPIOS_SURVEY_LOG} | |
87 | ${ZFS_SH} -u ${VERBOSE_FLAG} | \ | |
88 | tee -a ${ZPIOS_SURVEY_LOG} | |
89 | } | |
90 | ||
91 | # Disabling checksumming should show some (if small) improvement | |
92 | # simply due to freeing up a modest amount of CPU. | |
93 | zpios_survey_checksum() { | |
94 | TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+checksum" | |
95 | print_header ${TEST_NAME} | |
96 | ||
97 | ${ZFS_SH} ${VERBOSE_FLAG} | \ | |
98 | tee -a ${ZPIOS_SURVEY_LOG} | |
99 | ${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \ | |
100 | -s "set checksum=off" | \ | |
101 | tee -a ${ZPIOS_SURVEY_LOG} | |
102 | ${ZFS_SH} -u ${VERBOSE_FLAG} | \ | |
103 | tee -a ${ZPIOS_SURVEY_LOG} | |
104 | } | |
105 | ||
106 | # Increasing the pending IO depth also seems to improve things likely | |
107 | # at the expense of latency. This should be explored more because I'm | |
108 | # seeing a much bigger impact there that I would have expected. There | |
109 | # may be some low hanging fruit to be found here. | |
110 | zpios_survey_pending() { | |
111 | TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+pending" | |
112 | print_header ${TEST_NAME} | |
113 | ||
114 | ${ZFS_SH} ${VERBOSE_FLAG} \ | |
115 | zfs="zfs_vdev_max_pending=1024" | \ | |
116 | tee -a ${ZPIOS_SURVEY_LOG} | |
117 | ${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} | \ | |
118 | tee -a ${ZPIOS_SURVEY_LOG} | |
119 | ${ZFS_SH} -u ${VERBOSE_FLAG} | \ | |
120 | tee -a ${ZPIOS_SURVEY_LOG} | |
121 | } | |
122 | ||
123 | # To avoid memory fragmentation issues our slab implementation can be | |
124 | # based on a virtual address space. Interestingly, we take a pretty | |
125 | # substantial performance penalty for this somewhere in the low level | |
126 | # IO drivers. If we back the slab with kmem pages we see far better | |
127 | # read performance numbers at the cost of memory fragmention and general | |
128 | # system instability due to large allocations. This may be because of | |
129 | # an optimization in the low level drivers due to the contigeous kmem | |
130 | # based memory. This needs to be explained. The good news here is that | |
131 | # with zerocopy interfaces added at the DMU layer we could gaurentee | |
132 | # kmem based memory for a pool of pages. | |
133 | # | |
134 | # 0x100 = KMC_KMEM - Force kmem_* based slab | |
135 | # 0x200 = KMC_VMEM - Force vmem_* based slab | |
136 | zpios_survey_kmem() { | |
137 | TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+kmem" | |
138 | print_header ${TEST_NAME} | |
139 | ||
140 | ${ZFS_SH} ${VERBOSE_FLAG} \ | |
141 | zfs="zio_bulk_flags=0x100" | \ | |
142 | tee -a ${ZPIOS_SURVEY_LOG} | |
143 | ${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} | \ | |
144 | tee -a ${ZPIOS_SURVEY_LOG} | |
145 | ${ZFS_SH} -u ${VERBOSE_FLAG} | \ | |
146 | tee -a ${ZPIOS_SURVEY_LOG} | |
147 | } | |
148 | ||
149 | # Apply all possible turning concurrently to get a best case number | |
150 | zpios_survey_all() { | |
151 | TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+all" | |
152 | print_header ${TEST_NAME} | |
153 | ||
154 | ${ZFS_SH} ${VERBOSE_FLAG} \ | |
155 | zfs="zfs_vdev_max_pending=1024" \ | |
156 | zfs="zio_bulk_flags=0x100" | \ | |
157 | tee -a ${ZPIOS_SURVEY_LOG} | |
158 | ${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \ | |
159 | -o "--noprefetch --zerocopy" \ | |
160 | -s "set checksum=off" | \ | |
161 | tee -a ${ZPIOS_SURVEY_LOG} | |
162 | ${ZFS_SH} -u ${VERBOSE_FLAG} | \ | |
163 | tee -a ${ZPIOS_SURVEY_LOG} | |
164 | } | |
165 | ||
166 | ||
167 | PROFILE= | |
168 | ZPOOL_NAME=zpios-survey | |
169 | ZPOOL_CONFIG=zpool-config.sh | |
170 | ZPIOS_TEST=zpios-test.sh | |
171 | ZPIOS_SURVEY_LOG=/dev/null | |
172 | ||
173 | while getopts 'hvpc:t:l:' OPTION; do | |
174 | case $OPTION in | |
175 | h) | |
176 | usage | |
177 | exit 1 | |
178 | ;; | |
179 | v) | |
180 | VERBOSE=1 | |
181 | VERBOSE_FLAG="-v" | |
182 | ;; | |
183 | p) | |
184 | PROFILE=1 | |
185 | PROFILE_FLAG="-p" | |
186 | ;; | |
187 | c) | |
188 | ZPOOL_CONFIG=${OPTARG} | |
189 | ;; | |
190 | t) | |
191 | ZPIOS_TEST=${OPTARG} | |
192 | ;; | |
193 | l) | |
194 | ZPIOS_SURVEY_LOG=${OPTARG} | |
195 | ;; | |
196 | ?) | |
197 | usage | |
198 | exit | |
199 | ;; | |
200 | esac | |
201 | done | |
202 | ||
203 | if [ $(id -u) != 0 ]; then | |
204 | die "Must run as root" | |
205 | fi | |
206 | ||
207 | zpios_survey_base | |
208 | zpios_survey_prefetch | |
209 | zpios_survey_zerocopy | |
210 | zpios_survey_checksum | |
211 | zpios_survey_pending | |
212 | zpios_survey_kmem | |
213 | zpios_survey_all | |
214 | ||
215 | exit 0 |