简单、易用的 MySQL 官方压测工具
一、MySQL自帶的壓力測試工具 Mysqlslap
mysqlslap是mysql自帶的基準測試工具,該工具查詢數據,語法簡單,靈活容易使用.該工具可以模擬多個客戶端同時并發的向服務器發出查詢更新,給出了性能測試數據而且提供了多種引擎的性能比較。mysqlslap為mysql性能優化前后提供了直觀的驗證依據,系統運維和DBA人員應該掌握一些常見的壓力測試工具,才能準確的掌握線上數據庫支撐的用戶流量上限及其抗壓性等問題。
1、更改其默認的最大連接數
在對MySQL進行壓力測試之前,需要更改其默認的最大連接數,如下:
[root@mysql?~]#?vim?/etc/my.cnf ................ [mysqld] max_connections=1024[root@mysql?~]#?systemctl?restart?mysqld查看最大連接數
mysql>?show?variables?like?'max_connections'; +-----------------+-------+ |?Variable_name???|?Value?| +-----------------+-------+ |?max_connections?|?1024??| +-----------------+--------+ 1?row?in?set?(0.00?sec)進行壓力測試:
[root@mysql?~]#?mysqlslap?--defaults-file=/etc/my.cnf?--concurrency=100,200?--iterations=1?--number-int-cols=20?--number-char-cols=30?\--auto-generate-sql?--auto-generate-sql-add-autoincrement?--auto-generate-sql-load-type=mixed?--engine=myisam,innodb?--number-of-queries=2000?-uroot?-p123?--verbose上述命令測試說明:模擬測試兩次讀寫并發,第一次100,第二次200,自動生成SQL腳本,測試表包含20個init字段,30個char字段,每次執行2000查詢請求。測試引擎分別是myisam,innodb。(上述選項中有很多都是默認值,可以省略,如果想要了解各個選項的解釋,可以使用mysqlslap --help進行查詢)。
測試結果說明:
-
Myisam第一次100客戶端同時發起增查用0.557/s,第二次200客戶端同時發起增查用0.522/s
-
Innodb第一次100客戶端同時發起增查用0.256/s,第二次200客戶端同時發起增查用0.303/s
可以根據實際需求,一點點的加大并發數量進行壓力測試。
二、使用第三方sysbench工具進行壓力測試
1、安裝sysbench工具
[root@mysql?~]#?yum?-y?install?epel-release?#安裝第三方epel源[root@mysql?~]#?yum?-y?install?sysbench?#安裝sysbench工具[root@mysql?~]#?sysbench?--version?#確定工具已安裝 sysbench?1.0.17sysbench可以進行以下測試:
-
CPU 運算性能測試
-
磁盤 IO 性能測試
-
調度程序性能測試
-
內存分配及傳輸速度測試
-
POSIX 線程性能測試
數據庫性能測試(OLTP 基準測試,需要通過 /usr/share/sysbench/ 目錄中的 Lua 腳本執行,例如 oltp_read_only.lua 腳本執行只讀測試)。
sysbench 還可以通過運行命令時指定自己的 Lua 腳本來自定義測試。
2、查看sysbench工具的幫助選項
[root@mysql?~]#?sysbench?--help Usage: sysbench?[options]...?[testname]?[command]Commands?implemented?by?most?tests:?prepare?run?cleanup?help?#?可用的命令,四個General?options:?#?通用選項 --threads=N?要使用的線程數,默認?1?個?[1] --events=N?最大允許的事件個數?[0] --time=N?最大的總執行時間,以秒為單位?[10] --forced-shutdown=STRING?在?--time?時間限制到達后,強制關閉之前等待的秒數,默認“off”禁用(number?of?seconds?to?wait?after?the?--time?limit?before?forcing?shutdown,?or?'off'?to?disable)?[off] --thread-stack-size=SIZE?每個線程的堆棧大小?[64K] --rate=N 平均傳輸速率。0?則無限制?[0] --report-interval=N?以秒為單位定期報告具有指定間隔的中間統計信息?0?禁用中間報告?[0] --report-checkpoints=[LIST,...]?轉儲完整的統計信息并在指定的時間點重置所有計數器。參數是一個逗號分隔的值列表,表示從測試開始經過這個時間量時必須執行報告檢查點(以秒為單位)。報告檢查點默認關閉。?[] --debug[=on|off]?打印更多?debug?信息?[off] --validate[=on|off]?盡可能執行驗證檢查?[off] --help[=on|off]?顯示幫助信息并退出?[off] --version[=on|off]?顯示版本信息并退出?[off] --config-file=FILENAME?包含命令行選項的文件 --tx-rate=N?廢棄,改用?--rate?[0] --max-requests=N?廢棄,改用?--events?[0] --max-time=N?廢棄,改用?--time?[0] --num-threads=N?廢棄,改用?--threads?[1]Pseudo-Random?Numbers?Generator?options:?#?偽隨機數發生器選項 --rand-type=STRING?random?numbers?distribution?{uniform,gaussian,special,pareto}?[special] --rand-spec-iter=N?number?of?iterations?used?for?numbers?generation?[12] --rand-spec-pct=N?percentage?of?values?to?be?treated?as?'special'?(for?special?distribution)?[1] --rand-spec-res=N?percentage?of?'special'?values?to?use?(for?special?distribution)?[75] --rand-seed=N?seed?for?random?number?generator.?When?0,?the?current?time?is?used?as?a?RNG?seed.?[0] --rand-pareto-h=N?parameter?h?for?pareto?distribution?[0.2] Log?options:?#?日志選項 --verbosity=N?verbosity?level?{5?-?debug,?0?-?only?critical?messages}?[3] --percentile=N?percentile?to?calculate?in?latency?statistics?(1-100).?Use?the?special?value?of?0?to?disable?percentile?calculations?[95] --histogram[=on|off]?print?latency?histogram?in?report?[off]General?database?options:?#?通用的數據庫選項 --db-driver=STRING?指定要使用的數據庫驅動程序?('help'?to?get?list?of?available?drivers) --db-ps-mode=STRING?prepared?statements?usage?mode?{auto,?disable}?[auto]--db-debug[=on|off]?print?database-specific?debug?information?[off] Compiled-in?database?drivers:?#?內建的數據庫驅動程序,默認支持?MySQL?和?PostgreSQL mysql?-?MySQL?driver pgsql?-?PostgreSQL?drivermysql?options:?#?MySQL?數據庫專用選項 --mysql-host=[LIST,...]?MySQL?server?host?[localhost] --mysql-port=[LIST,...]?MySQL?server?port?[3306] --mysql-socket=[LIST,...]?MySQL?socket --mysql-user=STRING?MySQL?user?[sbtest] --mysql-password=STRING?MySQL?password?[] --mysql-db=STRING?MySQL?database?name?[sbtest] --mysql-ssl[=on|off]?use?SSL?connections,?if?available?in?the?client?library?[off] --mysql-ssl-cipher=STRING?use?specific?cipher?for?SSL?connections?[] --mysql-compression[=on|off]?use?compression,?if?available?in?the?client?library?[off] --mysql-debug[=on|off]?trace?all?client?library?calls?[off] --mysql-ignore-errors=[LIST,...]?list?of?errors?to?ignore,?or?"all"?[1213,1020,1205] --mysql-dry-run[=on|off]?Dry?run,?pretend?that?all?MySQL?client?API?calls?are?successful?without?executing?them?[off]pgsql?options:?#?PostgreSQL?數據庫專用選項 --pgsql-host=STRING?PostgreSQL?server?host?[localhost] --pgsql-port=N?PostgreSQL?server?port?[5432] --pgsql-user=STRING?PostgreSQL?user?[sbtest] --pgsql-password=STRING?PostgreSQL?password?[] --pgsql-db=STRING?PostgreSQL?database?name?[sbtest]Compiled-in?tests:?#?內建測試類型 fileio?-?File?I/O?test cpu?-?CPU?performance?test memory?-?Memory?functions?speed?test threads?-?Threads?subsystem?performance?test mutex?-?Mutex?performance?testSee?'sysbench?<testname>?help'?for?a?list?of?options?for?each?test.3、sysbench測試MySQL數據庫性能
1)準備測試數據
#查看sysbench自帶的lua腳本使用方法 [root@mysql?~]#?sysbench?/usr/share/sysbench/oltp_common.lua?help#必須創建sbtest庫,sbtest是sysbench默認使用的庫名 [root@mysql?~]#?mysqladmin?-uroot?-p123?create?sbtest;#然后,準備測試所用的表,這些測試表放在測試庫sbtest中。這里使用的lua腳本為/usr/share/sysbench/oltp_common.lua。 [root@mysql?~]#?sysbench?--mysql-host=127.0.0.1?\ --mysql-port=3306?\ --mysql-user=root?\ --mysql-password=123?\ /usr/share/sysbench/oltp_common.lua?\ --tables=10?\ --table_size=100000?\ prepare#其中--tables=10表示創建10個測試表, #--table_size=100000表示每個表中插入10W行數據, #prepare表示這是準備數的過程。2)確認測試數據以存在
[root@mysql?~]#?mysql?-uroot?-p123?sbtest;?#登錄到sbtest庫mysql>?show?tables;?#查看相應的表 +------------------+ |?Tables_in_sbtest?| +------------------+ |?sbtest1?| |?sbtest10?| |?sbtest2?| |?sbtest3?| |?sbtest4?| |?sbtest5?| |?sbtest6?| |?sbtest7?| |?sbtest8?| |?sbtest9?| +------------------+ 10?rows?in?set?(0.00?sec) mysql>?select?count(*)?from?sbtest1;?#隨機選擇一個表,確認其有100000條數據 +----------+ |?count(*)?| +----------+ |?100000?| +----------+ 1?row?in?set?(0.01?sec)3)數據庫測試和結果分析
稍微修改下之前準備數據的語句,就可以拿來測試了。需要注意的是,之前使用的lua腳本為oltp_common.lua,它是一個通用腳本,是被其它lua腳本調用的,它不能直接拿來測試。
所以,我這里用oltp_read_write.lua腳本來做讀、寫測試。還有很多其它類型的測試,比如只讀測試、只寫測試、刪除測試、大批量插入測試等等??烧业綄膌ua腳本進行調用即可。
#執行測試命令如下: [root@mysql?~]#?sysbench?--threads=4?\ --time=20?\ --report-interval=5?\ --mysql-host=127.0.0.1?\ --mysql-port=3306?\ --mysql-user=root?\ --mysql-password=123?\ /usr/share/sysbench/oltp_read_write.lua?\ --tables=10?\ --table_size=100000?\ run上述命令返回的結果如下:
[root@mysql?~]#?sysbench?--threads=4?--time=20?--report-interval=5?--mysql-host=127.0.0.1?--mysql-port=3306?--mysql-user=root?--mysql-password=123?/usr/share/sysbench/oltp_read_write.lua?--tables=10?--table_size=100000?runsysbench?1.0.17?(using?system?LuaJIT?2.0.4) Running?the?test?with?following?options: Number?of?threads:?4 Report?intermediate?results?every?5?second(s) Initializing?random?number?generator?from?current?time Initializing?worker?threads... Threads?started!#以下是每5秒返回一次的結果,統計的指標包括: #?線程數、tps(每秒事務數)、qps(每秒查詢數)、 #?每秒的讀/寫/其它次數、延遲、每秒錯誤數、每秒重連次數 [?5s?]?thds:?4?tps:?1040.21?qps:?20815.65?(r/w/o:?14573.17/4161.25/2081.22)?lat?(ms,95%):?7.17?err/s:?0.00?reconn/s:?0.00 [?10s?]?thds:?4?tps:?1083.34?qps:?21667.15?(r/w/o:?15165.93/4334.55/2166.68)?lat?(ms,95%):?6.55?err/s:?0.00?reconn/s:?0.00 [?15s?]?thds:?4?tps:?1121.57?qps:?22429.09?(r/w/o:?15700.64/4485.30/2243.15)?lat?(ms,95%):?6.55?err/s:?0.00?reconn/s:?0.00 [?20s?]?thds:?4?tps:?1141.69?qps:?22831.98?(r/w/o:?15982.65/4566.16/2283.18)?lat?(ms,95%):?6.09?err/s:?0.00?reconn/s:?0.00SQL?statistics:queries?performed: read:?307146?#?執行的讀操作數量 write:?87756?#?執行的寫操作數量 other:?43878?#?執行的其它操作數量total:?438780 transactions:?21939?(1096.57?per?sec.)?#?執行事務的平均速率 queries:?438780?(21931.37?per?sec.)?#?平均每秒能執行多少次查詢 ignored?errors:?0?(0.00?per?sec.) reconnects:?0?(0.00?per?sec.)General?statistics: total?time:?20.0055s?#?總消耗時間 total?number?of?events:?21939?#?總請求數量(讀、寫、其它)Latency?(ms): min:?1.39 avg:?3.64 max:?192.05 95th?percentile:?6.67?#?采樣計算的平均延遲 sum:?79964.26Threads?fairness: events?(avg/stddev):?5484.7500/15.12 execution?time?(avg/stddev):?19.9911/0.004、cpu/io/內存等測試
sysbench內置的幾個測試指標如下:
[root@mysql?~]#?sysbench?--help ..........?#?省略部分內容 Compiled-in?tests: fileio?-?File?I/O?test cpu?-?CPU?performance?test memory?-?Memory?functions?speed?test threads?-?Threads?subsystem?performance?test mutex?-?Mutex?performance?test可以直接help輸出測試方法,例如,fileio測試:
[root@mysql?~]#?sysbench?fileio?help sysbench?1.0.17?(using?system?LuaJIT?2.0.4)fileio?options: --file-num=N?number?of?files?to?create?[128] --file-block-size=N?block?size?to?use?in?all?IO?operations?[16384] --file-total-size=SIZE?total?size?of?files?to?create?[2G] --file-test-mode=STRING?test?mode?{seqwr,?seqrewr,?seqrd,?rndrd,?rndwr,?rndrw} --file-io-mode=STRING?file?operations?mode?{sync,async,mmap}?[sync] --file-async-backlog=N?number?of?asynchronous?operatons?to?queue?per?thread?[128] --file-extra-flags=[LIST,...]?list?of?additional?flags?to?use?to?open?files?{sync,dsync,direct}?[] --file-fsync-freq=N?do?fsync()?after?this?number?of?requests?(0?-?don't?use?fsync())?[100] --file-fsync-all[=on|off]?do?fsync()?after?each?write?operation?[off] --file-fsync-end[=on|off]?do?fsync()?at?the?end?of?test?[on] --file-fsync-mode=STRING?which?method?to?use?for?synchronization?{fsync,?fdatasync}?[fsync] --file-merged-requests=N?merge?at?most?this?number?of?IO?requests?if?possible?(0?-?don't?merge)?[0] --file-rw-ratio=N?reads/writes?ratio?for?combined?test?[1.5]1)測試io性能
例如,創建5個文件,總共2G,每個文件大概400M。
[root@mysql?~]#?sysbench?fileio?--file-num=5?--file-total-size=2G?prepare [root@mysql?~]#?ll?-lh?test* -rw-------?1?root?root?410M?May?26?16:05?test_file.0 -rw-------?1?root?root?410M?May?26?16:05?test_file.1 -rw-------?1?root?root?410M?May?26?16:05?test_file.2 -rw-------?1?root?root?410M?May?26?16:05?test_file.3 -rw-------?1?root?root?410M?May?26?16:05?test_file.4然后運行測試:
[root@mysql?~]#?sysbench?--events=5000?\ --threads=16?\ fileio?\ --file-num=5?\ --file-total-size=2G?\ --file-test-mode=rndrw?\ --file-fsync-freq=0?\ --file-block-size=16384?\ run返回的結果如下:
Running?the?test?with?following?options: Number?of?threads:?16 Initializing?random?number?generator?from?current?time Extra?file?open?flags:?(none) 5?files,?409.6MiB?each 2GiB?total?file?size Block?size?16KiB Number?of?IO?requests:?5000 Read/Write?ratio?for?combined?random?IO?test:?1.50 Calling?fsync()?at?the?end?of?test,?Enabled. Using?synchronous?I/O?mode Doing?random?r/w?test Initializing?worker?threads...Threads?started!File?operations: reads/s:?9899.03 writes/s:?6621.38 fsyncs/s:?264.33 Throughput:?#?吞吐量 read,?MiB/s:?154.66?#表示讀帶寬 written,?MiB/s:?103.46?#表示寫的帶寬General?statistics: total?time:?0.3014s total?number?of?events:?5000Latency?(ms): min:?0.00 avg:?0.81 max:?53.56 95th?percentile:?4.10 sum:?4030.48Threads?fairness: events?(avg/stddev):?312.5000/27.64 execution?time?(avg/stddev):?0.2519/0.022)測試cpu性能
[root@mysql?~]#?sysbench?cpu?--threads=40?--events=10000?--cpu-max-prime=20000?run壓測時,還請小心謹慎!!!!
總結
以上是生活随笔為你收集整理的简单、易用的 MySQL 官方压测工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 30个Python常用极简代码
- 下一篇: python 装饰器的妙用,实现类属性的