MySQL/MariaDB數據庫的性能測試
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.數據庫服務衡量指標
qps:
query per second(每秒支持多少查詢)
tps:
transaction per second(每秒支持多少個事務性能)
二.壓力測試工具
mysqlslap: Mariadb自帶的測試腳本
Sysbench:功能強大 https://github.com/akopytov/sysbench
tpcc-mysql
MySQL Benchmark Suite
MySQL super-smack
MyBench
三.Mysqlslap使用案例
1>.Mysqlslap概述
Mysqlslap:
來自於mariadb包,測試的過程默認生成一個mysqlslap的schema,生成測試表t1,查詢和插入測試數據,mysqlslap庫自動生成,如果已經存在則先刪除。用--only-print來打印實際的測試過程,整個測試完成后不會在數據庫中留下痕跡
使用格式:
mysqlslap [options]
2>.Mysqlslap常用參數 [options] 說明:
--auto-generate-sql, -a
自動生成測試表和數據,表示用mysqlslap工具自己生成的SQL腳本來測試並發壓力
--auto-generate-sql-load-type=type
測試語句的類型。代表要測試的環境是讀操作還是寫操作還是兩者混合的。取值包括:read,key,write,update和mixed(默認) --auto-generate-sql-add-auto-increment
代表對生成的表自動添加auto_increment列,從5.1.18版本開始支持
--number-char-cols=N, -x N
自動生成的測試表中包含多少個字符類型的列,默認1
--number-int-cols=N, -y N
自動生成的測試表中包含多少個數字類型的列,默認1
--number-of-queries=N
總的測試查詢次數(並發客戶數×每客戶查詢次數)
--query=name,-q
使用自定義腳本執行測試,例如可以調用自定義的存儲過程或者sql語句來執行測試
--create-schema
代表自定義的測試庫名稱,測試的schema
--commint=N
多少條DML后提交一次 --compress, -C
如服務器和客戶端都支持壓縮,則壓縮信息
--concurrency=N, -c N
表示並發量,即模擬多少個客戶端同時執行select。可指定多個值,以逗號或者--delimiter參數指定值做為分隔符 如:--concurrency=100,200,500
--engine=engine_name, -e engine_name
代表要測試的引擎,可以有多個,用分隔符隔開。例如:--engines=myisam,innodb
--iterations=N, -i N
測試執行的迭代次數,代表要在不同並發環境下,各自運行測試多少次
--only-print
只打印測試語句而不實際執行。
--detach=N
執行N條語句后斷開重連
--debug-info, -T
打印內存和CPU的相關信息

[root@node103.yinzhengjie.org.cn ~]# mysqlslap --help mysqlslap Ver 1.0 Distrib 5.5.64-MariaDB, for Linux (x86_64) Copyright (c) 2005, 2018, Oracle, MariaDB Corporation Ab and others. Run a query multiple times against the server. Usage: mysqlslap [OPTIONS] Default options are read from the following files in the given order: /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf The following groups are read: mysqlslap client client-server client-mariadb The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file. The following specify which files/extra groups are read (specified before remaining options): --defaults-file=# Only read default options from the given file #. --defaults-extra-file=# Read this file after the global files are read. --defaults-group-suffix=# Additionally read default groups with # appended as a suffix. -?, --help Display this help and exit. -a, --auto-generate-sql Generate SQL where not supplied by file or command line. --auto-generate-sql-add-autoincrement Add an AUTO_INCREMENT column to auto-generated tables. --auto-generate-sql-execute-number=# Set this number to generate a set number of queries to run. --auto-generate-sql-guid-primary Add GUID based primary keys to auto-generated tables. --auto-generate-sql-load-type=name Specify test load type: mixed, update, write, key, or read; default is mixed. --auto-generate-sql-secondary-indexes=# Number of secondary indexes to add to auto-generated tables. --auto-generate-sql-unique-query-number=# Number of unique queries to generate for automatic tests. --auto-generate-sql-unique-write-number=# Number of unique queries to generate for auto-generate-sql-write-number. --auto-generate-sql-write-number=# Number of row inserts to perform for each thread (default is 100). --commit=# Commit records every X number of statements. -C, --compress Use compression in server/client protocol. -c, --concurrency=name Number of clients to simulate for query to run. --create=name File or string to use create tables. --create-schema=name Schema to run tests in. --csv[=name] Generate CSV output to named file or to stdout if no file is named. -#, --debug[=#] This is a non-debug version. Catch this and exit. --debug-check Check memory and open file usage at exit. -T, --debug-info Print some debug info at exit. --default-auth=name Default authentication client-side plugin to use. -F, --delimiter=name Delimiter to use in SQL statements supplied in file or command line. --detach=# Detach (close and reopen) connections after X number of requests. -e, --engine=name Comma separated list of storage engines to use for creating the table. The test is run for each engine. You can also specify an option for an engine after a `:', like memory:max_row=2300 -h, --host=name Connect to host. --init-command=name SQL Command to execute when connecting to MySQL server. Will automatically be re-executed when reconnecting. -i, --iterations=# Number of times to run the tests. --no-drop Do not drop the schema after the test. -x, --number-char-cols=name Number of VARCHAR columns to create in table if specifying --auto-generate-sql. -y, --number-int-cols=name Number of INT columns to create in table if specifying --auto-generate-sql. --number-of-queries=# Limit each client to this number of queries (this is not exact). --only-print Do not connect to the databases, but instead print out what would have been done. -p, --password[=name] Password to use when connecting to server. If password is not given it's asked from the tty. --plugin-dir=name Directory for client-side plugins. -P, --port=# Port number to use for connection. --post-query=name Query to run or file containing query to execute after tests have completed. --post-system=name system() string to execute after tests have completed. --pre-query=name Query to run or file containing query to execute before running tests. --pre-system=name system() string to execute before running tests. --protocol=name The protocol to use for connection (tcp, socket, pipe, memory). -q, --query=name Query to run or file containing query to run. -s, --silent Run program in silent mode - no output. -S, --socket=name The socket file to use for connection. --ssl Enable SSL for connection (automatically enabled with other flags). --ssl-ca=name CA file in PEM format (check OpenSSL docs, implies --ssl). --ssl-capath=name CA directory (check OpenSSL docs, implies --ssl). --ssl-cert=name X509 cert in PEM format (implies --ssl). --ssl-cipher=name SSL cipher to use (implies --ssl). --ssl-key=name X509 key in PEM format (implies --ssl). --ssl-verify-server-cert Verify server's "Common Name" in its cert against hostname used when connecting. This option is disabled by default. -u, --user=name User for login if not current user. -v, --verbose More verbose output; you can use this multiple times to get even more verbose output. -V, --version Output version information and exit. Variables (--variable-name=value) and boolean options {FALSE|TRUE} Value (after reading options) ------------------------------------- ------------------------------------ auto-generate-sql FALSE auto-generate-sql-add-autoincrement FALSE auto-generate-sql-execute-number 0 auto-generate-sql-guid-primary FALSE auto-generate-sql-load-type mixed auto-generate-sql-secondary-indexes 0 auto-generate-sql-unique-query-number 10 auto-generate-sql-unique-write-number 10 auto-generate-sql-write-number 100 commit 0 compress FALSE concurrency (No default value) create (No default value) create-schema mysqlslap debug-check FALSE debug-info FALSE default-auth (No default value) delimiter detach 0 engine (No default value) host (No default value) init-command (No default value) iterations 1 no-drop FALSE number-char-cols (No default value) number-int-cols (No default value) number-of-queries 0 only-print FALSE plugin-dir (No default value) port 3306 post-query (No default value) post-system (No default value) pre-query (No default value) pre-system (No default value) query (No default value) silent FALSE socket (No default value) ssl FALSE ssl-ca (No default value) ssl-capath (No default value) ssl-cert (No default value) ssl-cipher (No default value) ssl-key (No default value) ssl-verify-server-cert FALSE user (No default value) verbose (No default value) [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#
3>.單線程測試

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -a -uroot -pyinzhengjie Benchmark Average number of seconds to run all queries: 0.003 seconds Minimum number of seconds to run all queries: 0.003 seconds Maximum number of seconds to run all queries: 0.003 seconds Number of clients running queries: 1 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#
4>.多線程測試(使用–concurrency來模擬並發連接)

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -a -uroot -pyinzhengjie -c 100 Benchmark Average number of seconds to run all queries: 0.653 seconds Minimum number of seconds to run all queries: 0.653 seconds Maximum number of seconds to run all queries: 0.653 seconds Number of clients running queries: 100 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]#
5>.迭代測試(用於需要多次執行測試得到平均值)

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -a -uroot -pyinzhengjie -i 10 Benchmark Average number of seconds to run all queries: 0.002 seconds Minimum number of seconds to run all queries: 0.002 seconds Maximum number of seconds to run all queries: 0.003 seconds Number of clients running queries: 1 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -a -uroot -pyinzhengjie --auto-generate-sql-add-autoincrement Benchmark Average number of seconds to run all queries: 0.002 seconds Minimum number of seconds to run all queries: 0.002 seconds Maximum number of seconds to run all queries: 0.002 seconds Number of clients running queries: 1 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -a -uroot -pyinzhengjie -a --auto-generate-sql-load-type=read Benchmark Average number of seconds to run all queries: 0.001 seconds Minimum number of seconds to run all queries: 0.001 seconds Maximum number of seconds to run all queries: 0.001 seconds Number of clients running queries: 1 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -a -uroot -pyinzhengjie -a auto-generate-sql-secondary-indexes=3 Benchmark Average number of seconds to run all queries: 0.003 seconds Minimum number of seconds to run all queries: 0.003 seconds Maximum number of seconds to run all queries: 0.003 seconds Number of clients running queries: 1 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -uroot -pyinzhengjie -a --auto-generate-sql-write-number=1000 Benchmark Average number of seconds to run all queries: 0.007 seconds Minimum number of seconds to run all queries: 0.007 seconds Maximum number of seconds to run all queries: 0.007 seconds Number of clients running queries: 1 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]#

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -uroot -pyinzhengjie --create-schema mysql -q "select count(*) from user" Benchmark Average number of seconds to run all queries: 0.000 seconds Minimum number of seconds to run all queries: 0.000 seconds Maximum number of seconds to run all queries: 0.000 seconds Number of clients running queries: 1 Average number of queries per client: 1 [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -uroot -pyinzhengjie -a -e innodb Benchmark Running for engine innodb Average number of seconds to run all queries: 0.003 seconds Minimum number of seconds to run all queries: 0.003 seconds Maximum number of seconds to run all queries: 0.003 seconds Number of clients running queries: 1 Average number of queries per client: 0 [root@node103.yinzhengjie.org.cn ~]#

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -uroot -pyinzhengjie -a --number-of-queries=10 Benchmark Average number of seconds to run all queries: 0.003 seconds Minimum number of seconds to run all queries: 0.003 seconds Maximum number of seconds to run all queries: 0.003 seconds Number of clients running queries: 1 Average number of queries per client: 10 [root@node103.yinzhengjie.org.cn ~]#
6>.測試同時不同的存儲引擎的性能進行對比

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -uroot -pyinzhengjie -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-infoBenchmark Running for engine myisam Average number of seconds to run all queries: 0.081 seconds Minimum number of seconds to run all queries: 0.080 seconds Maximum number of seconds to run all queries: 0.083 seconds Number of clients running queries: 50 Average number of queries per client: 20 Benchmark Running for engine myisam Average number of seconds to run all queries: 0.183 seconds Minimum number of seconds to run all queries: 0.081 seconds Maximum number of seconds to run all queries: 0.583 seconds Number of clients running queries: 100 Average number of queries per client: 10 Benchmark Running for engine innodb Average number of seconds to run all queries: 0.110 seconds Minimum number of seconds to run all queries: 0.097 seconds Maximum number of seconds to run all queries: 0.130 seconds Number of clients running queries: 50 Average number of queries per client: 20 Benchmark Running for engine innodb Average number of seconds to run all queries: 0.118 seconds Minimum number of seconds to run all queries: 0.111 seconds Maximum number of seconds to run all queries: 0.126 seconds Number of clients running queries: 100 Average number of queries per client: 10 User time 0.77, System time 0.46 Maximum resident set size 10628, Integral resident set size 0 Non-physical pagefaults 13187, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 46331, Involuntary context switches 29 [root@node103.yinzhengjie.org.cn ~]#
7>.執行一次測試,分別50和100個並發,執行1000次總查詢

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -uroot -pyinzhengjie -a --concurrency=50,100 --number-of-queries 1000 --debug-info Benchmark Average number of seconds to run all queries: 0.197 seconds Minimum number of seconds to run all queries: 0.197 seconds Maximum number of seconds to run all queries: 0.197 seconds Number of clients running queries: 50 Average number of queries per client: 20 Benchmark Average number of seconds to run all queries: 0.121 seconds Minimum number of seconds to run all queries: 0.121 seconds Maximum number of seconds to run all queries: 0.121 seconds Number of clients running queries: 100 Average number of queries per client: 10 User time 0.10, System time 0.05 Maximum resident set size 9744, Integral resident set size 0 Non-physical pagefaults 3967, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 5373, Involuntary context switches 15 [root@node103.yinzhengjie.org.cn ~]# [root@node103.yinzhengjie.org.cn ~]#
8>.50和100個並發分別得到一次測試結果(Benchmark),並發數越多,執行完所有查詢的時間越長。為了准確起見,可以多迭代測試幾次

[root@node103.yinzhengjie.org.cn ~]# mysqlslap -uroot -pyinzhengjie -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info Benchmark Average number of seconds to run all queries: 0.201 seconds Minimum number of seconds to run all queries: 0.098 seconds Maximum number of seconds to run all queries: 0.595 seconds Number of clients running queries: 50 Average number of queries per client: 20 Benchmark Average number of seconds to run all queries: 0.123 seconds Minimum number of seconds to run all queries: 0.113 seconds Maximum number of seconds to run all queries: 0.138 seconds Number of clients running queries: 100 Average number of queries per client: 10 User time 0.38, System time 0.27 Maximum resident set size 10600, Integral resident set size 0 Non-physical pagefaults 8716, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 26126, Involuntary context switches 19 [root@node103.yinzhengjie.org.cn ~]#