Zur Datenbankoptimierung ist es wichtig, dass man Lasttests fährt um das Systemverhalten auswerten zu können. In diesem Artikel beschreibe ich das Vorgehen zu einem Lasttest mit sysbench. Hierbei handelt es sich um eine Benchmark-Suite, welche in den Paketverwaltungen fast aller Linux Distributionen vorhanden ist oder nachinstalliert werden kann. Mit Hilfe von Sysbench verschafft man sich schnell einen Überblick über die Performance seiner Systeme.
Testen mit sysbench Benchmark Suite
Installation von sysbench
Sollte sysbench in der Linux Distribution vorhanden sein, sollte diese Version verwendet werden. Mit Debian Lenny wird kein Paket mitgeliefert, hier die manuelle Installation
1) Herunterladen von sysbench in der aktuellen Version: https://launchpad.net/sysbench/+packages und die Datei in das Verzeichnis /usr/src extrahieren:
tar xfz sysbench-0.4.12.tar.gz
2) Erforderliche Pakete installieren
apt-get install automake libmysqlclient15-dev build-essential
3) Kompilieren und installieren von sysbench
cd /usr/src/sysbench-0.4.12
sed -i configure.ac -e 's/AC_PROG_LIBTOOL/AC_PROG_RANLIB/' # fix
./autogen.sh # fix
./configure
make
cp sysbench/sysbench /usr/local/bin/
Testen
Eine Übersicht der Funktionen für Datenbank Tests liefert der Befehl ‘sysbench –test=oltp help’:
sysbench 0.4.12: multi-threaded system evaluation benchmark
oltp options:
--oltp-test-mode=STRING test type to use {simple,complex,nontrx,sp} [complex]
--oltp-reconnect-mode=STRING reconnect mode {session,transaction,query,random} [session]
--oltp-sp-name=STRING name of store procedure to call in SP test mode []
--oltp-read-only=[on|off] generate only 'read' queries (do not modify database) [off]
--oltp-skip-trx=[on|off] skip BEGIN/COMMIT statements [off]
--oltp-range-size=N range size for range queries [100]
--oltp-point-selects=N number of point selects [10]
--oltp-simple-ranges=N number of simple ranges [1]
--oltp-sum-ranges=N number of sum ranges [1]
--oltp-order-ranges=N number of ordered ranges [1]
--oltp-distinct-ranges=N number of distinct ranges [1]
--oltp-index-updates=N number of index update [1]
--oltp-non-index-updates=N number of non-index updates [1]
--oltp-nontrx-mode=STRING mode for non-transactional test {select, update_key, update_nokey, insert, delete} [select]
--oltp-auto-inc=[on|off] whether AUTO_INCREMENT (or equivalent) should be used on id column [on]
--oltp-connect-delay=N time in microseconds to sleep after connection to database [10000]
--oltp-user-delay-min=N minimum time in microseconds to sleep after each request [0]
--oltp-user-delay-max=N maximum time in microseconds to sleep after each request [0]
--oltp-table-name=STRING name of test table [sbtest]
--oltp-table-size=N number of records in test table [10000]
--oltp-dist-type=STRING random numbers distribution {uniform,gaussian,special} [special]
--oltp-dist-iter=N number of iterations used for numbers generation [12]
--oltp-dist-pct=N percentage of values to be treated as 'special' (for special distribution) [1]
--oltp-dist-res=N percentage of 'special' values to use (for special distribution) [75]
General database options:
--db-driver=STRING specifies database driver to use ('help' to get list of available drivers)
--db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]
Compiled-in database drivers:
mysql - MySQL driver
mysql options:
--mysql-host=[LIST,...] MySQL server host [localhost]
--mysql-port=N MySQL server port [3306]
--mysql-socket=STRING MySQL socket
--mysql-user=STRING MySQL user [sbtest]
--mysql-password=STRING MySQL password []
--mysql-db=STRING MySQL database name [sbtest]
--mysql-table-engine=STRING storage engine to use for the test table {myisam,innodb,bdb,heap,ndbcluster,federated} [innodb]
--mysql-engine-trx=STRING whether storage engine used is transactional or not {yes,no,auto} [auto]
--mysql-ssl=[on|off] use SSL connections, if available in the client library [off]
--myisam-max-rows=N max-rows parameter for MyISAM tables [1000000]
--mysql-create-options=STRING additional options passed to CREATE TABLE []
Der Test wird wie folgt ausgeführt:
mysqladmin create sbtest
sysbench --test=oltp --oltp-table-size=50000 --mysql-user=root --mysql-password=slphpdev prepare
sysbench --num-threads=4 --max-requests=50000 --test=oltp --mysql-user=root --mysql-password=slphpdev run
sysbench --test=oltp --mysql-user=root --mysql-password=slphpdev cleanup
mysqladmin drop -f sbtest
1) Die Datenbank sbtest wird angelegt 2) Der Test wird vorbereitet (die Zugangsdaten zur Datenbank müssen entsprechend angepasst werden) 3) Der Test wird durchgeführt (die Zugangsdaten zur Datenbank müssen entsprechend angepasst werden) 4) Aufräumarbeiten zum Test (die Zugangsdaten zur Datenbank müssen entsprechend angepasst werden) 5) Die Datenbank sbtest wird wieder entfernt.
Der Test liefert auf meiner Testumgebung folgendes Ergebnis:
sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql
Running the test with following options:
Number of threads: 4
Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 50000
Threads started!
Done.
OLTP test statistics:
queries performed:
read: 700014
write: 250002
other: 100001
total: 1050017
transactions: 50000 (334.21 per sec.)
deadlocks: 1 (0.01 per sec.)
read/write requests: 950016 (6350.16 per sec.)
other operations: 100001 (668.43 per sec.)
Test execution summary:
total time: 149.6051s
total number of events: 50000
total time taken by event execution: 598.1041
per-request statistics:
min: 2.56ms
avg: 11.96ms
max: 202.09ms
approx. 95 percentile: 21.70ms
Threads fairness:
events (avg/stddev): 12500.0000/102.19
execution time (avg/stddev): 149.5260/0.02
Testen mit sys-bench
Installation von sys-bench
Test
cd sql-bench
perl run-all-tests.sh --server=localhost
mysqlslap
mysqlslap to benchmark mysql queries mysqlslap is worth a look
mysqlslap –host=myhostname –user=myusername -p’mypassword’ –create-schema=mydatabase –delimiter=’;’ –concurrency=10 –iterations=5 –query=/tmp/queriestobenchmark.sql SAMPLE /tmp/queriestobenchmark.sql file
SELECT * FROM users; SELECT title FROM forum
Fazit
An sich ist ein Lasttest recht schnell installiert, konfiguriert und ausgeführt. Erst bei der Interpretation der Ergebnisse stehen viele Leute vor Problemen, weil Sie nicht wissen, was sie mit den Messdaten anfangen sollen. Deswegen ist immer ein gewisses Know-How, sowie ein strukturiertes Vorgehen notwendig. Da man sich dieses nicht innerhalb kurzer Zeit aneignen kann, sollte man hier auf entsprechende Expertendienste zurück greifen.