blob: 6c54a840b31b2568226bcef2160e27da476996c3 [file] [log] [blame]
Chase Qidc409a32017-01-09 16:28:04 +08001#!/bin/sh -e
2
3# SysBench is a modular, cross-platform and multi-threaded benchmark tool.
4# Current features allow to test the following system parameters:
5# * file I/O performance
6# * scheduler performance
7# * memory allocation and transfer speed
8# * POSIX threads implementation performance
9# * database server performance
10
11# shellcheck disable=SC1091
12. ../../lib/sh-test-lib
13
14OUTPUT="$(pwd)/output"
15RESULT_FILE="${OUTPUT}/result.txt"
16export RESULT_FILE
17SKIP_INSTALL="false"
18
19# sysbench test parameters.
20NUM_THREADS="1"
21TESTS="cpu memory threads mutex fileio oltp"
22
23usage() {
24 echo "usage: $0 [-n <num-threads>] [-t <test>] [-s <true|false>] 1>&2"
25 exit 1
26}
27
28while getopts "n:t:s:h" opt; do
29 case "${opt}" in
30 n) NUM_THREADS="${OPTARG}" ;;
31 t) TESTS="${OPTARG}" ;;
32 s) SKIP_INSTALL="${OPTARG}" ;;
33 h|*) usage ;;
34 esac
35done
36
37install_sysbench() {
38 git clone https://github.com/akopytov/sysbench
39 cd sysbench
40 git checkout 0.4
41 ./autogen.sh
42 ./configure "$1"
43 make install
44 cd ../
45}
46
47! check_root && error_msg "Please run this script as root."
48[ -d "${OUTPUT}" ] && mv "${OUTPUT}" "${OUTPUT}_$(date +%Y%m%d%H%M%S)"
49mkdir -p "${OUTPUT}"
50cd "${OUTPUT}"
51
52# Test installation.
53if [ "${SKIP_INSTALL}" = "true" ] || [ "${SKIP_INSTALL}" = "True" ]; then
54 info_msg "sysbench installation skipped"
55else
56 dist_name
57 # shellcheck disable=SC2154
58 case "${dist}" in
59 Debian|Ubuntu)
60 install_deps "git build-essential automake libtool"
61 if echo "${TESTS}" | grep "oltp"; then
62 install_deps "libmysqlclient-dev mysql-server"
63 systemctl start mysql
64 install_sysbench
65 else
66 install_sysbench "--without-mysql"
67 fi
68 ;;
69 Fedora|CentOS)
70 install_deps "git gcc make automake libtool"
71 if echo "${TESTS}" | grep "oltp"; then
72 install_deps "mysql-devel mariadb-server mariadb"
73 systemctl start mariadb
74 install_sysbench
75 else
76 install_sysbench "--without-mysql"
77 fi
78 ;;
79 Unknown)
80 warn_msg "Unsupported distro: package install skipped"
81 ;;
82 esac
83fi
84
85# Verify test installation.
86sysbench --version
87
88general_parser() {
89 ms=$(grep -m 1 "total time" "${logfile}" | awk '{print substr($NF,1,length($NF)-1)}')
90 add_metric "${tc}-total-time" "pass" "${ms}" "s"
91
92 ms=$(grep "total number of events" "${logfile}" | awk '{print $NF}')
93 add_metric "${tc}-total-number-of-events" "pass" "${ms}" "times"
94
95 ms=$(grep "total time taken by event execution" "${logfile}" | awk '{print $NF}')
96 add_metric "${tc}-total-time-taken-by-event-execution" "pass" "${ms}" "s"
97
98 for i in min avg max approx; do
99 ms=$(grep -m 1 "$i" "${logfile}" | awk '{print substr($NF,1,length($NF)-2)}')
100 add_metric "${tc}-response-time-$i" "pass" "${ms}" "ms"
101 done
102
103 ms=$(grep "events (avg/stddev)" "${logfile}" | awk '{print $NF}')
104 add_metric "${tc}-events-avg/stddev" "pass" "${ms}" "times"
105
106 ms=$(grep "execution time (avg/stddev)" "${logfile}" | awk '{print $NF}')
107 add_metric "${tc}-execution-time-avg/stddev" "pass" "${ms}" "s"
108}
109
110# Test run.
111for tc in ${TESTS}; do
112 echo
113 info_msg "Running sysbench ${tc} test..."
114 logfile="${OUTPUT}/sysbench-${tc}.txt"
115 case "${tc}" in
116 cpu|threads|mutex)
117 sysbench --num-threads="${NUM_THREADS}" --test="${tc}" run | tee "${logfile}"
118 general_parser
119 ;;
120 memory)
121 sysbench --num-threads="${NUM_THREADS}" --test=memory run | tee "${logfile}"
122 general_parser
123
124 ms=$(grep "Operations" "${logfile}" | awk '{print substr($4,2)}')
125 add_metric "${tc}-ops" "pass" "${ms}" "ops"
126
127 ms=$(grep "transferred" "${logfile}" | awk '{print substr($4, 2)}')
128 units=$(grep "transferred" "${logfile}" | awk '{print substr($5,1,length($NF)-1)}')
129 add_metric "${tc}-transfer" "pass" "${ms}" "${units}"
130 ;;
131 fileio)
132 mkdir fileio && cd fileio
133 for mode in seqwr seqrewr seqrd rndrd rndwr rndrw; do
134 tc="fileio-${mode}"
135 logfile="${OUTPUT}/sysbench-${tc}.txt"
136 sync
137 echo 3 > /proc/sys/vm/drop_caches
138 sleep 5
139 sysbench --num-threads="${NUM_THREADS}" --test=fileio --file-total-size=2G --file-test-mode="${mode}" prepare
140 # --file-extra-flags=direct is needed when file size is smaller then RAM.
141 sysbench --num-threads="${NUM_THREADS}" --test=fileio --file-extra-flags=direct --file-total-size=2G --file-test-mode="${mode}" run | tee "${logfile}"
142 sysbench --num-threads="${NUM_THREADS}" --test=fileio --file-total-size=2G --file-test-mode="${mode}" cleanup
143 general_parser
144
145 ms=$(grep "transferred" "${logfile}" | awk '{print substr($NF, 2,(length($NF)-8))}')
146 units=$(grep "transferred" "${logfile}" | awk '{print substr($NF,(length($NF)-6),6)}')
147 add_metric "${tc}-transfer" "pass" "${ms}" "${units}"
148
149 ms=$(grep "Requests/sec" "${logfile}" | awk '{print $1}')
150 add_metric "${tc}-ops" "pass" "${ms}" "ops"
151 done
152 cd ../
153 ;;
154 oltp)
155 # Use the same passwd as lamp and lemp tests.
156 mysqladmin -u root password lxmptest > /dev/null 2>&1 || true
157 # Delete sysbench in case it exists.
158 mysql --user='root' --password='lxmptest' -e 'DROP DATABASE sysbench' > /dev/null 2>&1 || true
159 # Create sysbench database.
160 mysql --user="root" --password="lxmptest" -e "CREATE DATABASE sysbench"
161
162 sysbench --num-threads="${NUM_THREADS}" --test=oltp --db-driver=mysql --oltp-table-size=1000000 --mysql-db=sysbench --mysql-user=root --mysql-password=lxmptest prepare
163 sysbench --num-threads="${NUM_THREADS}" --test=oltp --db-driver=mysql --oltp-table-size=1000000 --mysql-db=sysbench --mysql-user=root --mysql-password=lxmptest run | tee "${logfile}"
164
165 # Parse test log.
166 general_parser
167
168 for i in "read" write other total; do
169 ms=$(grep "${i}:" "${logfile}" | awk '{print $NF}')
170 add_metric "${tc}-${i}-queries" "pass" "${ms}" "queries"
171 done
172
173 for i in transactions deadlocks "read/write requests" "other operations"; do
174 ms=$(grep "${i}:" sysbench-oltp.txt | awk '{print substr($(NF-2),2)}')
175 i=$(echo "$i" | sed 's/ /-/g')
176 add_metric "${tc}-${i}" "pass" "${ms}" "ops"
177 done
178
179 # cleanup
180 mysql --user='root' --password='lxmptest' -e 'DROP DATABASE sysbench'
181 ;;
182 esac
183done