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