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.

Aktualisiert: