mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
MDEV-30839: Add new options to mini-benchmark and fixes
Add new options to mini-benchmark.sh so it is more useful, such as `--log` to avoid output from `lscpu` and other commands being lost. Also fix following errors: - Fix if condition for the cycle count regression verdict. The condition checked if the cycle count was greater than 850 billion, but `$RESULT` is only 3 digits and represents the number of cycles in billions. - Fix flamegraph width. The original width caused the flamegraph to be cut-off on most screen sizes in the browser. - Fix ShellCheck warnings and suggestions. - Fix condition to check if perf has permission to run on the system. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc.
This commit is contained in:
parent
8c5db7a187
commit
42a1f945a4
1 changed files with 71 additions and 20 deletions
|
@ -10,6 +10,18 @@ display_help() {
|
|||
echo "regressions."
|
||||
echo
|
||||
echo "optional arguments:"
|
||||
echo " --name STRING identifier for the benchmark, added to the "
|
||||
echo " folder name and (if --log is set) the log file "
|
||||
echo " --threads \"STRING\" quoted string of space-separated integers "
|
||||
echo " representing the threads to run."
|
||||
echo " example: --threads \"1 32 64 128\""
|
||||
echo " default: \"1 2 4 8 16\""
|
||||
echo " --duration INTEGER duration of each thread run in seconds"
|
||||
echo " default: 60"
|
||||
echo " --workload STRING sysbench workload to execute"
|
||||
echo " default: oltp_read_write"
|
||||
echo " --log logs the mini-benchmark stdout/stderr into the"
|
||||
echo " benchmark folder."
|
||||
echo " --perf measure CPU cycles and instruction count in for "
|
||||
echo " sysbench runs"
|
||||
echo " --perf-flamegraph record performance counters in perf.data.* and"
|
||||
|
@ -17,6 +29,12 @@ display_help() {
|
|||
echo " -h, --help display this help and exit"
|
||||
}
|
||||
|
||||
# Default parameters
|
||||
BENCHMARK_NAME='mini-benchmark'
|
||||
THREADS='1 2 4 8 16'
|
||||
DURATION=60
|
||||
WORKLOAD='oltp_read_write'
|
||||
|
||||
while :
|
||||
do
|
||||
case "$1" in
|
||||
|
@ -28,6 +46,31 @@ do
|
|||
display_version
|
||||
exit 0
|
||||
;;
|
||||
--name)
|
||||
shift
|
||||
BENCHMARK_NAME+='-'
|
||||
BENCHMARK_NAME+=$1
|
||||
shift
|
||||
;;
|
||||
--threads)
|
||||
shift
|
||||
THREADS=$1
|
||||
shift
|
||||
;;
|
||||
--duration)
|
||||
shift
|
||||
DURATION=$1
|
||||
shift
|
||||
;;
|
||||
--workload)
|
||||
shift
|
||||
WORKLOAD=$1
|
||||
shift
|
||||
;;
|
||||
--log)
|
||||
LOG=true
|
||||
shift
|
||||
;;
|
||||
--perf)
|
||||
PERF=true
|
||||
shift
|
||||
|
@ -47,6 +90,13 @@ do
|
|||
esac
|
||||
done
|
||||
|
||||
# Save results of this run in a subdirectory so that they are not overwritten by
|
||||
# the next run
|
||||
TIMESTAMP="$(date -Iseconds)"
|
||||
mkdir "$BENCHMARK_NAME-$TIMESTAMP"
|
||||
cd "$BENCHMARK_NAME-$TIMESTAMP" || exit 1
|
||||
|
||||
(
|
||||
# Check that the dependencies of this script are available
|
||||
if [ ! -e /usr/bin/pgrep ]
|
||||
then
|
||||
|
@ -62,6 +112,7 @@ fi
|
|||
|
||||
# If there are multiple processes, assume the last one is the actual server and
|
||||
# any potential other ones were just part of the service wrapper chain
|
||||
# shellcheck disable=SC2005
|
||||
MARIADB_SERVER_PID="$(echo "$(pgrep -f mariadbd || pgrep -f mysqld)" | tail -n 1)"
|
||||
|
||||
if [ -z "$MARIADB_SERVER_PID" ]
|
||||
|
@ -102,12 +153,13 @@ then
|
|||
echo "Ensure the MariaDB Server debug symbols are installed"
|
||||
for x in $(ldd /usr/sbin/mariadbd | grep -oE " /.* ")
|
||||
do
|
||||
rpm -q --whatprovides --qf '%{name}' $x | cut -d : -f 1
|
||||
rpm -q --whatprovides --qf '%{name}' "$x" | cut -d : -f 1
|
||||
done | sort -u > mariadbd-dependencies.txt
|
||||
# shellcheck disable=SC2046
|
||||
debuginfo-install -y mariadb-server $(cat mariadbd-dependencies.txt)
|
||||
|
||||
if [ ! $(perf record echo "testing perf" > /dev/null 2>&1) ]
|
||||
|
||||
perf record echo "testing perf" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "perf does not have permission to run on this system. Skipping."
|
||||
PERF=""
|
||||
|
@ -120,7 +172,8 @@ elif [ -e /usr/bin/perf ]
|
|||
then
|
||||
# If flamegraphs were not requested, log normal perf counters if possible
|
||||
|
||||
if [ ! $(perf stat echo "testing perf" > /dev/null 2>&1) ]
|
||||
perf stat echo "testing perf" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "perf does not have permission to run on this system. Skipping."
|
||||
PERF=""
|
||||
|
@ -156,28 +209,23 @@ mariadb -e "
|
|||
CREATE USER IF NOT EXISTS sbtest@localhost;
|
||||
GRANT ALL PRIVILEGES ON sbtest.* TO sbtest@localhost"
|
||||
|
||||
sysbench oltp_read_write prepare --tables=20 --table-size=100000 | tee sysbench-prepare.log
|
||||
sysbench "$WORKLOAD" prepare --tables=20 --table-size=100000 | tee sysbench-prepare.log
|
||||
sync && sleep 1 # Ensure writes were propagated to disk
|
||||
|
||||
# Save results of this run in a subdirectory so that they are not overwritten by
|
||||
# the next run
|
||||
TIMESTAMP="$(date -Iseconds)"
|
||||
mkdir "mini-benchmark-$TIMESTAMP"
|
||||
cd "mini-benchmark-$TIMESTAMP" || exit 1
|
||||
|
||||
# Run benchmark with increasing thread counts. The MariaDB Server will be using
|
||||
# around 300 MB of RAM and mostly reading and writing in RAM, so I/O usage is
|
||||
# also low. The benchmark will most likely be CPU bound to due to the load
|
||||
# profile, and also guaranteed to be CPU bound because of being limited to a
|
||||
# single CPU with 'tasksel'.
|
||||
for t in 1 2 4 8 16
|
||||
for t in $THREADS
|
||||
do
|
||||
# Prepend command with perf if defined
|
||||
# Output stderr to stdout as perf outpus everything in stderr
|
||||
$PERF $TASKSET_SYSBENCH sysbench oltp_read_write run --threads=$t --time=60 --report-interval=10 2>&1 | tee sysbench-run-$t.log
|
||||
# Output stderr to stdout as perf outputs everything in stderr
|
||||
# shellcheck disable=SC2086
|
||||
$PERF $TASKSET_SYSBENCH sysbench "$WORKLOAD" run --threads=$t --time=$DURATION --report-interval=10 2>&1 | tee sysbench-run-$t.log
|
||||
done
|
||||
|
||||
sysbench oltp_read_write cleanup --tables=20 | tee sysbench-cleanup.log
|
||||
sysbench "$WORKLOAD" cleanup --tables=20 | tee sysbench-cleanup.log
|
||||
|
||||
# Store results from 4 thread run in a Gitlab-CI compatible metrics file
|
||||
grep -oE '[a-z]+:[ ]+[0-9.]+' sysbench-run-4.log | sed -r 's/\s+/ /g' | tail -n 15 > metrics.txt
|
||||
|
@ -197,10 +245,10 @@ then
|
|||
|
||||
# Final verdict based on cpu cycle count
|
||||
RESULT="$(grep -h -e cycles sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')"
|
||||
if [ "$RESULT" -gt 850000000000 ]
|
||||
if [ "$RESULT" -gt 850 ]
|
||||
then
|
||||
echo # Newline improves readability
|
||||
echo "Benchmark exceeded 8.5 billion cpu cycles, performance most likely regressed!"
|
||||
echo "Benchmark exceeded 850 billion cpu cycles, performance most likely regressed!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
@ -216,12 +264,12 @@ if [ "$PERF_RECORD" == true ]
|
|||
then
|
||||
for f in perf.data.*
|
||||
do
|
||||
perf script -i $f | stackcollapse-perf.pl | flamegraph.pl --width 3000 > $f.svg
|
||||
perf script -i "$f" | stackcollapse-perf.pl | flamegraph.pl --width 1800 > "$f".svg
|
||||
done
|
||||
echo "Flamegraphs stored in folder mini-benchmark-$TIMESTAMP/"
|
||||
echo "Flamegraphs stored in folder $BENCHMARK_NAME-$TIMESTAMP/"
|
||||
fi
|
||||
|
||||
# Fallback if CPU cycle count not availalbe: final verdict based on peak QPS
|
||||
# Fallback if CPU cycle count not available: final verdict based on peak QPS
|
||||
RESULT="$(sort -k 9 -h sysbench-run-*.log | tail -n 1 | grep -oE "qps: [0-9]+" | grep -oE "[0-9]+")"
|
||||
case $RESULT in
|
||||
''|*[!0-9]*)
|
||||
|
@ -240,3 +288,6 @@ case $RESULT in
|
|||
fi
|
||||
;;
|
||||
esac
|
||||
# Record the output into the log file, if requested
|
||||
) 2>&1 | ($LOG && tee "$BENCHMARK_NAME"-"$TIMESTAMP".log)
|
||||
|
||||
|
|
Loading…
Reference in a new issue