Chase Qi | dc409a3 | 2017-01-09 16:28:04 +0800 | [diff] [blame] | 1 | #!/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 | |
| 14 | OUTPUT="$(pwd)/output" |
| 15 | RESULT_FILE="${OUTPUT}/result.txt" |
| 16 | export RESULT_FILE |
| 17 | SKIP_INSTALL="false" |
| 18 | |
| 19 | # sysbench test parameters. |
| 20 | NUM_THREADS="1" |
| 21 | TESTS="cpu memory threads mutex fileio oltp" |
| 22 | |
| 23 | usage() { |
| 24 | echo "usage: $0 [-n <num-threads>] [-t <test>] [-s <true|false>] 1>&2" |
| 25 | exit 1 |
| 26 | } |
| 27 | |
| 28 | while 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 |
| 35 | done |
| 36 | |
| 37 | install_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)" |
| 49 | mkdir -p "${OUTPUT}" |
| 50 | cd "${OUTPUT}" |
| 51 | |
| 52 | # Test installation. |
| 53 | if [ "${SKIP_INSTALL}" = "true" ] || [ "${SKIP_INSTALL}" = "True" ]; then |
| 54 | info_msg "sysbench installation skipped" |
| 55 | else |
| 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 |
| 83 | fi |
| 84 | |
| 85 | # Verify test installation. |
| 86 | sysbench --version |
| 87 | |
| 88 | general_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. |
| 111 | for 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 |
| 183 | done |