MySQL壓力測試方法 如何使用mysqlslap測試MySQL的壓力?
其實(shí)mysql測試也沒有這么復(fù)雜,除了一些常用的select\insert\update\deletc這些外,其實(shí)測試他的并發(fā)量才是最重要的。比如在連接數(shù)1K的時候,并發(fā)量能否滿足當(dāng)前請求\服務(wù)器性能、內(nèi)存CPU使用情況。說白了,測試mysql就是測試他的配置文件和并發(fā)量及服務(wù)器性能。
一、工具
首選工具mysql自帶的:mysqlslap
–auto-generate-sql, -a
自動生成測試表和數(shù)據(jù)
–auto-generate-sql-load-type=type
測試語句的類型。取值包括:read,key,write,update和mixed(默認(rèn))。
–number-char-cols=N, -x N
自動生成的測試表中包含多少個字符類型的列,默認(rèn)1
–number-int-cols=N, -y N
自動生成的測試表中包含多少個數(shù)字類型的列,默認(rèn)1
–number-of-queries=N
總的測試查詢次數(shù)(并發(fā)客戶數(shù)×每客戶查詢次數(shù))
–query=name,-q
使用自定義腳本執(zhí)行測試,例如可以調(diào)用自定義的一個存儲過程或者sql語句來執(zhí)行測試。
–create-schema
測試的schema,MySQL中schema也就是database
–commint=N
多少條DML后提交一次
–compress, -C
如果服務(wù)器和客戶端支持都壓縮,則壓縮信息傳遞
–concurrency=N, -c N
并發(fā)量,也就是模擬多少個客戶端同時執(zhí)行select??芍付ǘ鄠€值,以逗號或者–delimiter參數(shù)指定的值做為分隔符
–engine=engine_name, -e engine_name
創(chuàng)建測試表所使用的存儲引擎,可指定多個
–iterations=N, -i N
測試執(zhí)行的迭代次數(shù)
–detach=N
執(zhí)行N條語句后斷開重連
–debug-info, -T
打印內(nèi)存和CPU的信息
–only-print
只打印測試語句而不實(shí)際執(zhí)行
———————————————————————————————-
測試的過程需要生成測試表,插入測試數(shù)據(jù),這個mysqlslap可以自動生成,默認(rèn)生成一個mysqlslap的schema,如果已經(jīng)存在則先刪除,這里要注意了,不要用–create-schema指定已經(jīng)存在的庫,否則后果可能很嚴(yán)重??梢杂猫Conly-print來打印實(shí)際的測試過程:
# mysqlslap -a –only-print
DROP SCHEMA IF EXISTS `mysqlslap`;
CREATE SCHEMA `mysqlslap`;
use mysqlslap;
CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128));
INSERT INTO t1 VALUES (1804289383,'mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRD9rdxBL');
…
SELECT intcol1,charcol1 FROM t1;
INSERT INTO t1 VALUES (364531492,'qMa5SuKo4M5OM7ldvisSc6WK9rsNTGFxkDJ4EAwW');
DROP SCHEMA IF EXISTS `mysqlslap`;
可以看到最后由刪除一開始創(chuàng)建的schema的動作,整個測試完成后不會在數(shù)據(jù)庫中留下痕跡。假如我們執(zhí)行一次測試,分別50和100個并發(fā),執(zhí)行1000次總查詢,那么:
# mysqlslap -uroot -p123456 -a –concurrency=50,100 –number-of-queries 1000 –debug-info
Benchmark
Average number of seconds to run all queries: 0.375 seconds
Minimum number of seconds to run all queries: 0.375 seconds
Maximum number of seconds to run all queries: 0.375 seconds
Number of clients running queries: 50
Average number of queries per client: 20
Benchmark
Average number of seconds to run all queries: 0.453 seconds
Minimum number of seconds to run all queries: 0.453 seconds
Maximum number of seconds to run all queries: 0.453 seconds
Number of clients running queries: 100
Average number of queries per client: 10
User time 0.29, System time 0.11
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 4032, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 7319, Involuntary context switches 681
以上結(jié)果可以看出,50和100個并發(fā)分別得到一次測試結(jié)果(Benchmark),并發(fā)數(shù)越多,執(zhí)行完所有查詢的時間越長。為了準(zhǔn)確起見,可以多迭代測試幾次:
# mysqlslap -a –concurrency=50,100 –number-of-queries 1000 –iterations=5 –debug-info
Benchmark
Average number of seconds to run all queries: 0.380 seconds
Minimum number of seconds to run all queries: 0.377 seconds
Maximum number of seconds to run all queries: 0.385 seconds
Number of clients running queries: 50
Average number of queries per client: 20
Benchmark
Average number of seconds to run all queries: 0.447 seconds
Minimum number of seconds to run all queries: 0.444 seconds
Maximum number of seconds to run all queries: 0.451 seconds
Number of clients running queries: 100
Average number of queries per client: 10
User time 1.44, System time 0.67
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 17922, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 36796, Involuntary context switches 4093
測試同時不同的存儲引擎的性能進(jìn)行對比:
# mysqlslap -uroot -p123456 -a -concurrency=50,100 –number-of-queries 1000 –iterations=5 –engine=myisam,innodb –debug-info
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.200 seconds
Minimum number of seconds to run all queries: 0.188 seconds
Maximum number of seconds to run all queries: 0.210 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.238 seconds
Minimum number of seconds to run all queries: 0.228 seconds
Maximum number of seconds to run all queries: 0.251 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.375 seconds
Minimum number of seconds to run all queries: 0.370 seconds
Maximum number of seconds to run all queries: 0.379 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.443 seconds
Minimum number of seconds to run all queries: 0.440 seconds
Maximum number of seconds to run all queries: 0.447 seconds
Number of clients running queries: 100
Average number of queries per client: 10
User time 2.83, System time 1.66
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 34692, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 87306, Involuntary context switches 10326
# mysqladmin -uroot -p123456 -i 10 extended status 每10秒刷新一次
Aborted_connects 嘗試已經(jīng)失敗的MySQL服務(wù)器的連接的次數(shù)。
Connections 試圖連接MySQL服務(wù)器的次數(shù)。
Created_tmp_tables 當(dāng)執(zhí)行語句時,已經(jīng)被創(chuàng)造了的隱含臨時表的數(shù)量。
Delayed_insert_threads 正在使用的延遲插入處理器線程的數(shù)量。
Delayed_writes 用INSERT DELAYED寫入的行數(shù)。
Delayed_errors 用INSERT DELAYED寫入的發(fā)生某些錯誤(可能重復(fù)鍵值)的行數(shù)。
Flush_commands 執(zhí)行FLUSH命令的次數(shù)。
Handler_delete 請求從一張表中刪除行的次數(shù)。
Handler_read_first 請求讀入表中第一行的次數(shù)。
Handler_read_key 請求數(shù)字基于鍵讀行。
Handler_read_next 請求讀入基于一個鍵的一行的次數(shù)。
Handler_read_rnd 請求讀入基于一個固定位置的一行的次數(shù)。
Handler_update 請求更新表中一行的次數(shù)。
Handler_write 請求向表中插入一行的次數(shù)。
Key_blocks_used 用于關(guān)鍵字緩存的塊的數(shù)量。
Key_read_requests 請求從緩存讀入一個鍵值的次數(shù)。
Key_reads 從磁盤物理讀入一個鍵值的次數(shù)。
Key_write_requests 請求將一個關(guān)鍵字塊寫入緩存次數(shù)。
Key_writes 將一個鍵值塊物理寫入磁盤的次數(shù)。
Max_used_connections 同時使用的連接的最大數(shù)目。
Not_flushed_key_blocks 在鍵緩存中已經(jīng)改變但是還沒被清空到磁盤上的鍵塊。
Not_flushed_delayed_rows 在INSERT DELAY隊列中等待寫入的行的數(shù)量。
Open_tables 打開表的數(shù)量。
Open_files 打開文件的數(shù)量。
Open_streams 打開流的數(shù)量(主要用于日志記載)
Opened_tables 已經(jīng)打開的表的數(shù)量。
Questions 發(fā)往服務(wù)器的查詢的數(shù)量。
Slow_queries 要花超過long_query_time時間的查詢數(shù)量。
Threads_connected 當(dāng)前打開的連接的數(shù)量。
Threads_running 不在睡眠的線程數(shù)量。
Uptime 服務(wù)器工作了多少秒。
相關(guān)文章
解決Windows環(huán)境下安裝 mysql-8.0.11-winx64 遇到的問題
這篇文章主要介紹了Windows環(huán)境下安裝 mysql-8.0.11-winx64 遇到的問題及解決辦法 ,需要的朋友可以參考下2018-10-10MySQL進(jìn)行表之間關(guān)聯(lián)更新的實(shí)現(xiàn)方法
在實(shí)際編程工作或運(yùn)維實(shí)踐中,對MySQL數(shù)據(jù)庫表進(jìn)行關(guān)聯(lián)更新是一種比較常見的應(yīng)用場景,針對這樣的業(yè)務(wù)場景,我們來看看有什么方法可以實(shí)現(xiàn)關(guān)聯(lián)更新,需要的朋友可以參考下2023-10-10MySQL實(shí)現(xiàn)清空分區(qū)表單個分區(qū)數(shù)據(jù)
這篇文章主要介紹了MySQL實(shí)現(xiàn)清空分區(qū)表單個分區(qū)數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03MySQL中使用case when 語句實(shí)現(xiàn)多條件查詢的方法
今天在一個應(yīng)用中使用到了一個比較特殊的數(shù)據(jù)查詢要求。需要的朋友可以參考下。2010-12-12SQL模糊查詢報:ORA-00909:參數(shù)個數(shù)無效問題的解決
這篇文章主要介紹了SQL模糊查詢報:ORA-00909:參數(shù)個數(shù)無效問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06mysql中自增auto_increment功能的相關(guān)設(shè)置及問題
mysql中的自增auto_increment功能相信每位phper都用過,本文就為大家分享一下mysql字段自增功能的具體查看及設(shè)置方法2012-12-12MySQL中interactive_timeout和wait_timeout的區(qū)別
這篇文章主要介紹了MySQL中interactive_timeout和wait_timeout的區(qū)別,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10