====== MySQL - Benchmark ======
siehe auch:
* [[::MySQL - Benchmark]]
* [[::MySQL-Lasttest]]
* [[::MySQL Tuning]]
===== wie skaliert MySQL/MariaDB über mehrere CPU-Kerne =====
Aktuelle [[https://dodwell.us/mysql-tuning.html|Infos]] findet man darüber fast nur zu MySQL und diese besagen, dass MySQL vor Version 5.5 nur bis 4-8 CPU-Kerne schneller wurde.
Die Version 5.5 soll schon bis ca. 32 Kerne an Leistung gewonnen haben und dann zumindest gleichbleibende Leistung aufgewiesen haben (Plateau-Bildung).
Mit der Version 5.6 soll MySQL bis zu 48 Kernen an Leistung gewinnen.
Es ist anzunehmen, dass spätere Versionen diese Fähigkeit weiter ausbauen...
Da es eine gewisse Beziehung [[https://mariadb.com/kb/en/mariadb-vs-mysql-compatibility/|Drop-in Compatibility]] zwischen MySQL und MariaDB gibt:
* MySQL 5.1 -> MariaDB 5.1
* MySQL 5.1 -> MariaDB 5.2
* MySQL 5.1 -> MariaDB 5.3
* MySQL 5.5 -> MariaDB 5.5
* MySQL 5.6 -> MariaDB 10.0
* MySQL 5.6 -> MariaDB 10.1
* MySQL 5.7 -> MariaDB 10.2
* MySQL 5.7 -> MariaDB 10.3
* MySQL 5.7 -> MariaDB 10.4
...kann man die oben erwähnten Aussagen, über die MySQL-DB, auch auf die MariaDB anwenden.
//Meine Tests mit "MariaDB 10.3" haben gezeigt, dass sie auch von Hyper-Threading profitiert, was oft ja anders geäußert wird.//
===== mit vielen kleinen INSERTs =====
hiermit werden 10 Prozesse gestartet, von denen jeder 100000 Datensätze in eine Test-Tabelle schreibt:
> ~/bin/MySQL-Test.sh localhost 3306 10 100000
Es werden in 10 Tabellen jeweils 100000 Datensätze eingetragen.
Laufzeit: 28 Sekunden
hiermit werden 100 Prozesse gestartet, von denen jeder 10000 Datensätze in eine Test-Tabelle schreibt:
> ~/bin/MySQL-Test.sh localhost 3306 100 10000
Es werden in 100 Tabellen jeweils 10000 Datensätze eingetragen.
Laufzeit: 22 Sekunden
das ist nicht genau, aber es liefert Anhaltspunkte
#!/bin/sh
#==============================================================================#
#VERSION="v2022022200" # universell umgebaut
VERSION="v2022022300" # universell umgebaut
if [ "x${4}" = x ] ; then
echo "${0} [Hostname] [Port] [Threads] [Inserts]"
echo "${0} 127.0.0.1 3306 8 100000"
echo "${0} localhost 3306 8 100000"
exit 10
else
MYSQL_HOST="${1}"
MYSQL_PORT="${2}"
THREADS="${3}" # 2 4 5 6 7 8 16 32 64 128 256 512
REQUESTS="${4}" # 100000
fi
#==============================================================================#
#------------------------------------------------------------------------------#
MYSQL_USR=root # Voreinstellung: sbtest
MYSQL_PWD="$(echo Z2VoZWltCg== | base64 -d)"
MYSQL_DB=mytest # Voreinstellung: sbtest
echo "
START TRANSACTION;
DROP DATABASE IF EXISTS ${MYSQL_DB};
CREATE DATABASE IF NOT EXISTS ${MYSQL_DB};
COMMIT;
" | mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USR} -p${MYSQL_PWD}
#------------------------------------------------------------------------------#
#set -x
START_ZEIT="$(date -u +'%s')"
for i in $(seq 1 ${THREADS})
do
echo "
START TRANSACTION;
CREATE TABLE ${MYSQL_DB}.tabelle${i} (
spalte01 VARCHAR(255) default NULL,
PRIMARY KEY (spalte01)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
" | mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USR} -p${MYSQL_PWD} ${MYSQL_DB}
echo "SELECT * FROM ${MYSQL_DB}.tabelle${i};" | mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USR} -p${MYSQL_PWD}
(
date > /tmp/${MYSQL_DB}.tabelle${i}
for A in $(seq 1 ${REQUESTS})
do
echo "INSERT INTO ${MYSQL_DB}.tabelle${i} (spalte01) VALUES ('${A}');"
done | taskset --cpu-list 0-8 mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USR} -p${MYSQL_PWD} ${MYSQL_DB}
rm -f /tmp/${MYSQL_DB}.tabelle${i}
) &
done
echo "Es werden in ${THREADS} Tabellen jeweils ${REQUESTS} Datensätze eingetragen."
#echo "echo \"SHOW PROCESSLIST;\" | mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USR} -p${MYSQL_PWD} -t"
WARTEN="$(ls /tmp/${MYSQL_DB}.tabelle* 2>/dev/null | wc -l)"
while [ 0 -lt ${WARTEN} ]
do
WARTEN="$(ls /tmp/${MYSQL_DB}.tabelle* 2>/dev/null | wc -l)"
sleep 0.2
done
STOP_ZEIT="$(date -u +'%s')"
echo "Laufzeit: $(echo "${START_ZEIT} ${STOP_ZEIT}" | awk '{print $2 - $1}') Sekunden"
===== sysbench =====
__Sysbench ist nicht in jedem Fall geeignet um die Leistung einer bestehenden Datenbank zu testen!__
[[https://www.mortensi.com/2021/06/how-to-install-and-use-sysbench/|How to Install and Use Sysbench]]
sysbench oltp_read_write --table-size=1000000 --db-driver=mysql --mysql-host= --mysql-db= --mysql-user= --mysql-password= prepare
sysbench oltp_read_write --table-size=1000000 --db-driver=mysql --mysql-host= --mysql-db= --mysql-user= --mysql-password= --threads=2 --report-interval=3 --histogram --time=50 run
==== Anwendungsbeispiel ====
Leistungsdaten der Datenbank ermitteln:
~/bin/MySQL-Benchmark.sh
Ergebnisse ansehen:
less /tmp/sysbench_*.log
Am Ende sollte man die Datenbank wieder löschen,\\
zum Beispiel so:
echo "DROP DATABASE test;" | mysql -P3306 -uroot -pgeheim
=== ab Ubuntu 18.04 LTS ===
#!/bin/sh
#==============================================================================#
VERSION="v2021041400" # universell umgebaut
if [ "x${2}" = x ] ; then
echo "${0} [Hostname] [Port]"
echo "${0} 127.0.0.1 3306"
exit 10
else
MYSQL_HOST="${1}"
MYSQL_PORT="${2}"
fi
#==============================================================================#
#------------------------------------------------------------------------------#
MYSQL_USR=root # Voreinstellung: sbtest
MYSQL_PWD="$(echo Z2VoZWltCg== | base64 -d)"
MYSQL_DB=test # Voreinstellung: sbtest
MAX_REQUESTS=10000
MAX_TIME=120
DIE_TESTS="cpu memory threads mutex"
THREADS="2 4 6 8 16 32 64 128 256 512"
#------------------------------------------------------------------------------#
for TEST in ${DIE_TESTS}
do
echo "================================================================================"
for i in ${THREADS}
do
#AUSGABE="$(sysbench --num-threads=${i} --max-requests=${MAX_REQUESTS} --max-time=${MAX_TIME} --mysql-host=${MYSQL_HOST} --mysql-db=${MYSQL_DB} --mysql-port=${MYSQL_PORT} --mysql-user=${MYSQL_USR} --mysql-password=${MYSQL_PWD} --test=${TEST} run)"
#echo "sysbench --threads=${i} --events=${MAX_REQUESTS} --time=${MAX_TIME} --mysql-host=${MYSQL_HOST} --mysql-db=${MYSQL_DB} --mysql-port=${MYSQL_PORT} --mysql-user=${MYSQL_USR} --mysql-password=${MYSQL_PWD} ${TEST} run"
AUSGABE="$(sysbench --threads=${i} --events=${MAX_REQUESTS} --time=${MAX_TIME} --mysql-host=${MYSQL_HOST} --mysql-db=${MYSQL_DB} --mysql-port=${MYSQL_PORT} --mysql-user=${MYSQL_USR} --mysql-password=${MYSQL_PWD} ${TEST} run)"
if [ "memory" = "${TEST}" ] ; then
echo "${AUSGABE}" | egrep '^### threads=| transferred ' | awk -F"[()]" -v threads=${i} -v test=${TEST} '{print test,"/",threads,"threads / transferred:",$2}'
elif [ "threads" = "${TEST}" ] ; then
echo "${AUSGABE}" | egrep '^### threads=|execution time' | awk -v threads=${i} -v test=${TEST} '{gsub("/"," ");print test,"/",threads,"threads / execution time:",$(NF-1)}'
else
#echo "${AUSGABE}" | egrep '^### threads=|approx. 95 percentile:' | awk -v threads=${i} -v test=${TEST} '{print test,"/",threads,"threads / Laufzeit von 95%:",$NF}'
echo "${AUSGABE}" | egrep '^### threads=|95th percentile:' | awk -v threads=${i} -v test=${TEST} '{print test,"/",threads,"threads / Laufzeit von 95%:",$NF}'
fi
done
done
# time /root/bin/MySQL-Benchmark.sh 127.0.0.1 3321
================================================================================
cpu / 2 threads / Laufzeit von 95%: 0.94
cpu / 4 threads / Laufzeit von 95%: 0.94
cpu / 6 threads / Laufzeit von 95%: 0.94
cpu / 8 threads / Laufzeit von 95%: 0.95
cpu / 16 threads / Laufzeit von 95%: 1.23
cpu / 32 threads / Laufzeit von 95%: 17.32
cpu / 64 threads / Laufzeit von 95%: 25.28
cpu / 128 threads / Laufzeit von 95%: 44.98
cpu / 256 threads / Laufzeit von 95%: 81.48
cpu / 512 threads / Laufzeit von 95%: 81.48
================================================================================
memory / 2 threads / transferred: 2951.27 MiB/sec
memory / 4 threads / transferred: 3677.08 MiB/sec
memory / 6 threads / transferred: 4221.30 MiB/sec
memory / 8 threads / transferred: 4687.99 MiB/sec
memory / 16 threads / transferred: 7318.17 MiB/sec
memory / 32 threads / transferred: 8103.36 MiB/sec
memory / 64 threads / transferred: 8237.30 MiB/sec
memory / 128 threads / transferred: 8200.69 MiB/sec
memory / 256 threads / transferred: 8223.93 MiB/sec
memory / 512 threads / transferred: 8310.27 MiB/sec
================================================================================
threads / 2 threads / execution time: 3.5541
threads / 4 threads / execution time: 1.9458
threads / 6 threads / execution time: 1.4515
threads / 8 threads / execution time: 2.1365
threads / 16 threads / execution time: 2.6424
threads / 32 threads / execution time: 3.6737
threads / 64 threads / execution time: 3.4397
threads / 128 threads / execution time: 5.3409
threads / 256 threads / execution time: 4.7104
threads / 512 threads / execution time: 4.4099
================================================================================
mutex / 2 threads / Laufzeit von 95%: 161.51
mutex / 4 threads / Laufzeit von 95%: 173.58
mutex / 6 threads / Laufzeit von 95%: 227.40
mutex / 8 threads / Laufzeit von 95%: 240.02
mutex / 16 threads / Laufzeit von 95%: 320.17
mutex / 32 threads / Laufzeit von 95%: 623.33
mutex / 64 threads / Laufzeit von 95%: 1213.57
mutex / 128 threads / Laufzeit von 95%: 2405.65
mutex / 256 threads / Laufzeit von 95%: 4768.67
mutex / 512 threads / Laufzeit von 95%: 9624.59
real 4m14,055s
user 35m38,690s
sys 2m50,152s
----
=== bis Ubuntu 16.04 LTS ===
SysBench arbeitet wie folgt:
* mit dem **MyISAM**-Back-End (/usr/share/doc/sysbench/tests/db/oltp.lua)
* ca. 140.000 Lesezugriffe
* ca. 40.000 Schreibzugriffe (abschaltbar)
* ca. 20.000 andere Zugriffe (z.B. DROP, DELETE)
Einstellungen vornehmen:
vi ~/bin/MySQL-Benchmark.cfg
Datenbank für den Test anlegen und vorberiten:
~/bin/MySQL-Benchmark_Vorbereitung.sh
Leistungsdaten der Datenbank ermitteln:
~/bin/MySQL-Benchmark.sh
Ergebnisse ansehen:
less /tmp/sysbench.log
Am Ende sollte man die Datenbank wieder löschen,\\
zum Beispiel so:
echo "DROP DATABASE test;" | mysql -P3306 -uroot -pgeheim
#!/bin/sh
#==============================================================================#
VERSION="v2021041400" # universell umgebaut
if [ "x${2}" = x ] ; then
echo "${0} [Hostname] [Port]"
echo "${0} 127.0.0.1 3306"
exit 10
else
MYSQL_HOST="${1}"
MYSQL_PORT="${2}"
fi
#==============================================================================#
#------------------------------------------------------------------------------#
MYSQL_USR=root # Voreinstellung: sbtest
MYSQL_PWD="$(echo Z2VoZWltCg== | base64 -d)"
MYSQL_DB=test # Voreinstellung: sbtest
MAX_REQUESTS=10000
MAX_TIME=120
TESTS="cpu memory threads mutex"
#------------------------------------------------------------------------------#
for TEST in ${TESTS}
do
echo "================================================================================"
for i in 2 4 6 8 16 32 64 128 256 512
do
AUSGABE="$(sysbench --num-threads=${i} --max-requests=${MAX_REQUESTS} --max-time=${MAX_TIME} --mysql-host=${MYSQL_HOST} --mysql-db=${MYSQL_DB} --mysql-port=${MYSQL_PORT} --mysql-user=${MYSQL_USR} --mysql-password=${MYSQL_PWD} --test=${TEST} run)"
if [ "memory" = "${TEST}" ] ; then
echo "${AUSGABE}" | egrep '^### threads=| transferred ' | awk -F"[()]" -v threads=${i} -v test=${TEST} '{print test,"/",threads,"threads / transferred:",$2}'
elif [ "threads" = "${TEST}" ] ; then
echo "${AUSGABE}" | egrep '^### threads=|execution time' | awk -v threads=${i} -v test=${TEST} '{gsub("/"," ");print test,"/",threads,"threads / execution time:",$(NF-1)}'
else
echo "${AUSGABE}" | egrep '^### threads=|approx. 95 percentile:' | awk -v threads=${i} -v test=${TEST} '{print test,"/",threads,"threads / Laufzeit von 95%:",$NF}'
fi
done
done
# time /root/bin/MySQL-Benchmark.sh 127.0.0.1 3320
================================================================================
cpu / 2 threads / Laufzeit von 95%: 1.80ms
cpu / 4 threads / Laufzeit von 95%: 1.80ms
cpu / 6 threads / Laufzeit von 95%: 1.28ms
cpu / 8 threads / Laufzeit von 95%: 1.51ms
cpu / 16 threads / Laufzeit von 95%: 2.07ms
cpu / 32 threads / Laufzeit von 95%: 17.50ms
cpu / 64 threads / Laufzeit von 95%: 33.50ms
cpu / 128 threads / Laufzeit von 95%: 41.50ms
cpu / 256 threads / Laufzeit von 95%: 69.83ms
cpu / 512 threads / Laufzeit von 95%: 61.54ms
================================================================================
memory / 2 threads / transferred: 1755.38 MB/sec
memory / 4 threads / transferred: 2646.58 MB/sec
memory / 6 threads / transferred: 2517.85 MB/sec
memory / 8 threads / transferred: 2739.69 MB/sec
memory / 16 threads / transferred: 1703.85 MB/sec
memory / 32 threads / transferred: 1787.66 MB/sec
memory / 64 threads / transferred: 1798.00 MB/sec
memory / 128 threads / transferred: 1734.30 MB/sec
memory / 256 threads / transferred: 1767.17 MB/sec
memory / 512 threads / transferred: 1767.09 MB/sec
================================================================================
threads / 2 threads / execution time: 4.1759
threads / 4 threads / execution time: 2.3417
threads / 6 threads / execution time: 2.2158
threads / 8 threads / execution time: 3.5415
threads / 16 threads / execution time: 4.4740
threads / 32 threads / execution time: 5.3136
threads / 64 threads / execution time: 8.6983
threads / 128 threads / execution time: 9.3741
threads / 256 threads / execution time: 8.6209
threads / 512 threads / execution time: 8.5981
================================================================================
mutex / 2 threads / Laufzeit von 95%: 10000000.00ms
mutex / 4 threads / Laufzeit von 95%: 10000000.00ms
mutex / 6 threads / Laufzeit von 95%: 10000000.00ms
mutex / 8 threads / Laufzeit von 95%: 10000000.00ms
mutex / 16 threads / Laufzeit von 95%: 10000000.00ms
mutex / 32 threads / Laufzeit von 95%: 718.57ms
mutex / 64 threads / Laufzeit von 95%: 1218.04ms
mutex / 128 threads / Laufzeit von 95%: 2271.56ms
mutex / 256 threads / Laufzeit von 95%: 4583.28ms
mutex / 512 threads / Laufzeit von 95%: 9164.94ms
real 10m18.639s
user 29m43.736s
sys 85m16.524s
----