Whamcloud - gitweb
LU-14876 out: don't connect to busy MDS-MDS export
[fs/lustre-release.git] / lustre / tests / scrub-performance.sh
1 #!/bin/bash
2
3 set -e
4
5 ONLY=${ONLY:-"$*"}
6
7 LUSTRE=${LUSTRE:-$(dirname $0)/..}
8 . $LUSTRE/tests/test-framework.sh
9 init_test_env $@
10 init_logging
11
12 ALWAYS_EXCEPT="$SCRUB_PERFORMANCE_EXCEPT"
13 build_test_filter
14
15 [ "$SLOW" = "no" ] &&
16         skip "skip scrub performance test under non-SLOW mode" && exit 0
17
18 [ "$mds1_FSTYPE" != ldiskfs ] &&
19         skip "ldiskfs only test"
20 [[ "$MDS1_VERSION" -lt $(version_code 2.2.90) ]] &&
21         skip "Need MDS version at least 2.2.90"
22 require_dsh_mds || exit 0
23
24 NTHREADS=${NTHREADS:-0}
25 UNIT=${UNIT:-1048576}
26 BACKUP=${BACKUP:-0}
27 MINCOUNT=${MINCOUNT:-8192}
28 MAXCOUNT=${MAXCOUNT:-32768}
29 FACTOR=${FACTOR:-2}
30
31 RCMD="do_facet ${SINGLEMDS}"
32 RLCTL="${RCMD} ${LCTL}"
33 MDT_DEV="${FSNAME}-MDT0000"
34 MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
35 SHOW_SCRUB="${RLCTL} get_param -n osd-ldiskfs.${MDT_DEV}.oi_scrub"
36 remote_mds && ECHOCMD=${RCMD} || ECHOCMD="eval"
37
38 if [ ${NTHREADS} -eq 0 ]; then
39         CPUCORE=$(${RCMD} cat /proc/cpuinfo | grep "processor.*:" | wc -l)
40         NTHREADS=$((CPUCORE * 2))
41 fi
42
43 cleanupall
44
45 if ! combined_mgs_mds ; then
46         do_rpc_nodes $(facet_active_host mgs) load_modules_local
47         add mgs $(mkfs_opts mgs $(mgsdevname)) --backfstype ldiskfs \
48                 --reformat $(mgsdevname) $(mgsvdevname) ${quiet:+>/dev/null} ||
49                 exit 1
50
51         start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "Fail to start MGS!"
52 fi
53
54 do_rpc_nodes $(facet_active_host $SINGLEMDS) load_modules_local
55 reformat_external_journal ${SINGLEMDS}
56 add ${SINGLEMDS} $(mkfs_opts ${SINGLEMDS} ${MDT_DEVNAME}) --backfstype ldiskfs \
57         --reformat ${MDT_DEVNAME} $(mdsvdevname 1) ${quiet:+>/dev/null} ||
58         exit 2
59
60 scrub_attach() {
61         ${ECHOCMD} "${LCTL} <<-EOF
62                 attach echo_client scrub-MDT0000 scrub-MDT0000_UUID
63                 setup ${MDT_DEV} mdd
64         EOF"
65 }
66
67 scrub_detach() {
68         ${ECHOCMD} "${LCTL} <<-EOF
69                 device scrub-MDT0000
70                 cleanup
71                 detach
72         EOF"
73 }
74
75 scrub_create() {
76         local echodev=$(${RLCTL} dl | grep echo_client|awk '{print $1}')
77         local j
78
79         ${ECHOCMD} "${LCTL} <<-EOF
80                 cfg_device ${echodev}
81                 test_mkdir ${tdir}
82         EOF"
83
84         for ((j=1; j<${threads}; j++)); do
85                 ${ECHOCMD} "${LCTL} <<-EOF
86                         cfg_device ${echodev}
87                         test_mkdir ${tdir}${j}
88                 EOF"
89         done
90
91         ${ECHOCMD} "${LCTL} <<-EOF
92                 cfg_device ${echodev}
93                 --threads ${threads} 0 ${echodev} test_create \
94                 -d ${tdir} -D ${threads} -b ${lbase} -c 0 -n ${usize}
95         EOF"
96 }
97
98 scrub_cleanup() {
99         cleanupall
100         do_rpc_nodes $(facet_active_host $SINGLEMDS) unload_modules
101         if ! combined_mgs_mds ; then
102                 do_rpc_nodes $(facet_active_host mgs) unload_modules
103         fi
104         REFORMAT="yes" cleanup_and_setup_lustre
105 }
106
107 scrub_create_nfiles() {
108         local total=$1
109         local lbase=$2
110         local threads=$3
111         local ldir="/test-${lbase}"
112         local cycle=0
113         local count=${UNIT}
114
115         while true; do
116                 [ ${count} -eq 0 -o  ${count} -gt ${total} ] && count=${total}
117                 local usize=$((count / NTHREADS))
118                 [ ${usize} -eq 0 ] && break
119                 local tdir=${ldir}-${cycle}-
120
121                 echo "[cycle: ${cycle}] [threads: ${threads}]"\
122                      "[files: ${count}] [basedir: ${tdir}]"
123                 start ${SINGLEMDS} $MDT_DEVNAME $MDS_MOUNT_OPTS ||
124                         error "Fail to start MDS!"
125                 scrub_attach
126                 scrub_create
127                 scrub_detach
128                 stop ${SINGLEMDS} || error "Fail to stop MDS!"
129
130                 total=$((total - usize * NTHREADS))
131                 [ ${total} -eq 0 ] && break
132                 lbase=$((lbase + usize))
133                 cycle=$((cycle + 1))
134         done
135 }
136
137 test_0() {
138         local BASECOUNT=0
139         local i
140
141         for ((i=$MINCOUNT; i<=$MAXCOUNT; i=$((i * FACTOR)))); do
142                 local nfiles=$((i - BASECOUNT))
143                 local stime=$(date +%s)
144
145                 echo "+++ start to create for ${i} files set at: $(date) +++"
146                 scrub_create_nfiles ${nfiles} ${BASECOUNT} ${NTHREADS} ||
147                         error "Fail to create files!"
148                 echo "+++ end to create for ${i} files set at: $(date) +++"
149                 local etime=$(date +%s)
150                 local delta=$((etime - stime))
151                 [ $delta -gt 0 ] || delta=1
152                 echo "create ${nfiles} files used ${delta} seconds"
153                 echo "create speed is $((nfiles / delta))/sec"
154
155                 BASECOUNT=${i}
156                 if [ ${BACKUP} -ne 0 ]; then
157                         stime=$(date +%s)
158                         echo "backup/restore ${i} files start at: $(date)"
159                         mds_backup_restore $SINGLEMDS ||
160                                 error "Fail to backup/restore!"
161                         echo "backup/restore ${i} files end at: $(date)"
162                         etime=$(date +%s)
163                         delta=$((etime - stime))
164                         [ $delta -gt 0 ] || delta=1
165                         echo "backup/restore ${i} files used ${delta} seconds"
166                         echo "backup/restore speed is $((i / delta))/sec"
167                 else
168                         mds_remove_ois $SINGLEMDS ||
169                                 error "Fail to remove/recreate!"
170                 fi
171
172                 echo "--- start to rebuild OI for $i files set at: $(date) ---"
173                 start ${SINGLEMDS} $MDT_DEVNAME $MDS_MOUNT_OPTS > /dev/null ||
174                         error "Fail to start MDS!"
175
176                 while true; do
177                         local STATUS=$($SHOW_SCRUB |
178                                         awk '/^status/ { print $2 }')
179                         [ "$STATUS" == "completed" ] && break
180                         sleep 3 # check status every 3 seconds
181                 done
182
183                 echo "--- end to rebuild OI for ${i} files set at: $(date) ---"
184                 local RTIME=$($SHOW_SCRUB | awk '/^run_time/ { print $2 }')
185                 echo "rebuild OI for ${i} files used ${RTIME} seconds"
186                 local SPEED=$($SHOW_SCRUB | awk '/^average_speed/ { print $2 }')
187                 echo "rebuild speed is ${SPEED}/sec"
188                 stop ${SINGLEMDS} > /dev/null || error "Fail to stop MDS!"
189         done
190 }
191 run_test 0 "OI scrub performance test"
192
193 # cleanup the system at last
194 scrub_cleanup
195 complete $SECONDS
196 check_and_cleanup_lustre
197 exit_status