1. 程式人生 > >使用sysbench對mysql壓力測試

使用sysbench對mysql壓力測試

sysbench是一個模組化的、跨平臺、多執行緒基準測試工具,主要用於評估測試各種不同系統引數下的資料庫負載情況。關於這個專案的詳細介紹請看:https://github.com/akopytov/sysbench 。
它主要包括以下幾種方式的測試:

  1. cpu效能

  2. 磁碟io效能

  3. 排程程式效能

  4. 記憶體分配及傳輸速度

  5. POSIX執行緒效能

  6. 資料庫效能(OLTP基準測試)

sysbench的資料庫OLTP測試支援MySQL、PostgreSQL、Oracle,目前主要用於Linux作業系統,開源社群已經將sysbench移植到了Windows,並支援SQL Server的基準測試。

廢話不多說,開始。

1. sysbench安裝

mysql版本: mysql-community-server-5.6.29 
OS: CentOS 6.7 X86_64
sysbench 0.5相比0.4版本有一些變化,包括oltp測試結合了lua指令碼,還多了一些隱藏選項,本文會涉及得到一部分。

目前許多倉庫裡已編譯好的二進位制sysbench還是0.4.x版本,不過現在主流也還是github上的0.5,可以從 這裡下載0.5版本的rpm包直接安裝,不過我選擇自己編譯,因為只有這個辦法是通用的。

// 先安裝編譯依賴環境
$ sudo yum install gcc gcc-c++ automake make  libtool mysql-community-devel

$ cd /tmp && git clone https://github.com/akopytov/sysbench.git

$ cd /tmp/sysbench && ./autogen.sh
$ ./configure --prefix=/usr/local/sysbench-0.5
$ ./make && sudo make install // 0.5版本需要oltp.lua測試指令碼 // 如果是rpm包方式安裝的,在 /usr/share/doc/sysbench/tests/db/ 下可找到 $ cd /usr/local/sysbench && sudo mkdir -p share/tests/db $ cp /tmp/sysbench/sysbench/tests/db/*.lua share/tests/db/ $ ./bin/sysbench --version sysbench 0.5

如果需要測試PostgreSQL、Oracle,則在configure時需要加上 --with-oracle 或者 –with-pgsql 引數

2. 使用sysbench對mysql壓測

2.1 只讀示例

./bin/sysbench --test=./share/tests/db/oltp.lua \
--mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser \
--mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 \
--report-interval=10 --oltp-dist-type=uniform --rand-init=on --max-requests=0 \
--oltp-test-mode=nontrx --oltp-nontrx-mode=select \
--oltp-read-only=on --oltp-skip-trx=on \
--max-time=120 --num-threads=12 \
[prepare|run|cleanup]

注意最後一行,一項測試開始前需要用prepare來準備好表和資料,run執行真正的壓測,cleanup用來清除資料和表。實際prepare的表結構:

mysql> desc dbtest1a.sbtest1;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| k     | int(10) unsigned | NO   | MUL | 0       |                |
| c     | char(120)        | NO   |     |         |                |
| pad   | char(60)         | NO   |     |         |                |
+-------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

上面的測試命令代表的是:對mysql進行oltp基準測試,表數量10,每錶行數約50w(幾乎delete多少就會insert的多少),並且是非事務的只讀測試,持續60s,併發執行緒數12。

需要說明的選項:

  • mysql-db=dbtest1a:測試使用的目標資料庫,這個庫名要事先建立

  • --oltp-tables-count=10:產生表的數量

  • --oltp-table-size=500000:每個表產生的記錄行數

  • --oltp-dist-type=uniform:指定隨機取樣型別,可選值有 uniform(均勻分佈), Gaussian(高斯分佈), special(空間分佈)。預設是special

  • --oltp-read-only=off:表示不止產生只讀SQL,也就是使用oltp.lua時會採用讀寫混合模式。預設 off,如果設定為on,則不會產生update,delete,insert的sql。

  • --oltp-test-mode=nontrx :執行模式,這裡是非事務式的。可選值有simple,complex,nontrx。預設是complex

    • simple:簡單查詢,SELECT c FROM sbtest WHERE id=N

    • complex (advanced transactional):事務模式在開始和結束事務之前加上begin和commit, 一個事務裡可以有多個語句,如點查詢、範圍查詢、排序查詢、更新、刪除、插入等,並且為了不破壞測試表的資料,該模式下一條記錄刪除後會在同一個事務裡新增一條相同的記錄。

    • nontrx (non-transactional):與simple相似,但是可以進行update/insert等操作,所以如果做連續的對比壓測,你可能需要重新cleanup,prepare。

  • --oltp-skip-trx=[on|off]:省略begin/commit語句。預設是off

  • --rand-init=on:是否隨機初始化資料,如果不隨機化那麼初始好的資料每行內容除了主鍵不同外其他完全相同

  • --num-threads=12: 併發執行緒數,可以理解為模擬的客戶端併發連線數

  • --report-interval=10:表示每10s輸出一次測試進度報告

  • --max-requests=0:壓力測試產生請求的總數,如果以下面的max-time來記,這個值設為0

  • --max-time=120:壓力測試的持續時間,這裡是2分鐘。

注意,針對不同的選項取值就會有不同的子選項。比如oltp-dist-type=special,就有比如oltp-dist-pct=1oltp-dist-res=50兩個子選項,代表有50%的查詢落在1%的行(即熱點資料)上,另外50%均勻的(sample uniformly)落在另外99%的記錄行上。

再比如oltp-test-mode=nontrx時, 就可以有oltp-nontrx-mode,可選值有select(預設), update_key, update_nokey, insert, delete,代表非事務式模式下使用的測試sql型別。

以上代表的是一個只讀的例子,可以把num-threads依次遞增(16,36,72,128,256,512),或者調整my.cnf引數,比較效果。另外需要注意的是,大部分mysql中介軟體對事務的處理,預設都是把sql發到主庫執行,所以只讀測試需要加上oltp-skip-trx=on來跳過測試中的顯式事務。

ps1: 只讀測試也可以使用share/tests/db/select.lua進行,但只是簡單的point select。
ps2: 我在用sysbench壓的時候,在mysql後端會話裡有時看到大量的query cache lock,如果使用的是uniform取樣,最好把查詢快取關掉。當然如果是做兩組效能對比壓測,因為都受這個因素影響,關心也不大。

2.2 混合讀寫

讀寫測試還是用oltp.lua,只需把--oltp-read-only等於off

./bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser --mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=120 --num-threads=128 prepare

./bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser --mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=120 --num-threads=128 run

./bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser --mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=120 --num-threads=128 cleanup

然而oltp-test-mode=nontrx一直沒有跟著我預期的去走,在mysql general log裡面看到的sql記錄與complex模式相同。所以上面示例中的--oltp-test-mode=nontrx --oltp-nontrx-mode=select可以刪掉。

update: 
sysbench作者 akopytov 對我這個疑問有了回覆:https://github.com/akopytov/sysbench/iss... ,原來sysbench 0.5版本去掉了這個選項,因為作者正在準備1.0版本,所以也就沒有更新0.5版本的doc。網上的部落格漫天飛,就沒有一個提出來的,也是沒誰了。

分析一下oltp.lua指令碼內容,可以清楚單個事務各操作的預設比例:select:update_key:update_non_key:delete:insert = 14:1:1:1:1,可通過oltp-point-selectsoltp-simple-rangesoltp-sum-rangesoltp-order-rangesoltp-distinct-rangesoltp-index-updatesoltp-non-index-updates這些選項去調整讀寫權重。

同只讀測試一樣,在atlas,mycat這類中介軟體測試中如果不加oltp-skip-trx=on,那麼所有查詢都會發往主庫,但如果在有寫入的情況下使用--oltp-skip-trx=on跳過BEGIN和COMMIT,會出現問題:

ALERT: failed to execute MySQL query: `INSERT INTO sbtest4 (id, k, c, pad) VALUES (48228,
47329, '82773802508-44916890724-85859319254-67627358653-96425730419-64102446666-75789993135-91202056934-68463872307-28147315305', 
'13146850449-23153169696-47584324044-14749610547-34267941374')`:
ALERT: Error 1062 Duplicate entry '48228' for key 'PRIMARY'
FATAL: failed to execute function `event': (null)

原因也很容易理解,每個執行緒將選擇一個隨機的表,不加事務的情況下高併發更新(插入)出現重複key的概率很大,但我們壓測不在乎這些資料,所以需要跳過這個錯誤--mysql-ignore-errors=1062,這個問題老外有出過打補丁的方案允許--mysql-ignore-duplicates=on,但作者新加入的忽略錯誤碼這個功能已經取代了它。mysql-ignore-errors選項是0.5版本加入的,但目前沒有文件標明,也是我在github上提的 issue 作者回復的。

這裡不得不佩服老外的辦事效率和責任心,提個疑惑能立馬得到回覆,反觀國內,比如在atlas,mycat專案裡提到問題到現在都沒人搭理。。。

2.3 只更新

如果基準測試的時候,你只想比較兩個專案的update(或insert)效率,那可以不使用oltp指令碼,而直接改用update_index.lua

./bin/sysbench --test=./share/tests/db/update_index.lua \
--mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser \
--mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 \
--report-interval=10 --rand-init=on --max-requests=0 \
--oltp-read-only=off --max-time=120 --num-threads=128 \
[ prepare | run | cleanup ]

此時像oltp-read-only=off許多引數都失效了。需要說明的是這裡 (非)索引更新,不是where條件根據索引去查詢更新,而是更新索引列上的值。

3. 結果解讀

sysbench 0.5:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 128
Report intermediate results every 20 second(s)
Initializing random number generator from timer.

Random number generator seed is 0 and will be ignored


Initializing worker threads...

Threads started!

[  20s] threads: 128, tps: 2354.54, reads: 33035.89, writes: 9423.39, response time: 66.80ms (95%), errors: 0.00, reconnects:  0.00
[  40s] threads: 128, tps: 2377.75, reads: 33274.26, writes: 9507.55, response time: 66.88ms (95%), errors: 0.00, reconnects:  0.00
[  60s] threads: 128, tps: 2401.35, reads: 33615.30, writes: 9607.40, response time: 66.40ms (95%), errors: 0.00, reconnects:  0.00
[  80s] threads: 128, tps: 2381.20, reads: 33331.50, writes: 9522.55, response time: 67.30ms (95%), errors: 0.00, reconnects:  0.00
[ 100s] threads: 128, tps: 2388.85, reads: 33446.10, writes: 9556.35, response time: 67.00ms (95%), errors: 0.00, reconnects:  0.00
[ 120s] threads: 128, tps: 2386.40, reads: 33421.35, writes: 9545.35, response time: 66.94ms (95%), errors: 0.00, reconnects:  0.00
OLTP test statistics:
    queries performed:
        read:                            4003048  //總select數量
        write:                           1143728  //總updateinsertdelete語句數量
        other:                           571864   //commitunlock tables以及其他mutex的數量
        total:                           5718640
    transactions:                        285932 (2382.10 per sec.) //通常需要關注的數字(TPS)
    read/write requests:                 5146776 (42877.85 per sec.)
    other operations:                    571864 (4764.21 per sec.)
    ignored errors:                      0      (0.00 per sec.) //忽略的錯誤數
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          120.0334s //即max-time指定的壓測實際
    total number of events:              285932   //總的事件數,一般與transactions相同
    total time taken by event execution: 15362.6623s
    response time:
         min:                                 17.60ms
         avg:                                 53.73ms //95%的語句的平均響應時間
         max:                                252.90ms
         approx.  95 percentile:              66.88ms

Threads fairness:
    events (avg/stddev):           2233.8438/9.04
    execution time (avg/stddev):   120.0208/0.01

我們一般關注的用於繪圖的指標主要有:

  • response time avg: 平均響應時間。(後面的95%的大小可以通過--percentile=98的方式去更改)

  • transactions: 精確的說是這一項後面的TPS 。但如果使用了-oltp-skip-trx=on,這項事務數恆為0,需要用total number of events 去除以總時間,得到tps(其實還可以分為讀tps和寫tps)

  • read/write requests: 用它除以總時間,得到吞吐量QPS

  • 當然還有一些系統層面的cpu,io,mem相關指標

sysbench還可以對檔案系統IO測試,CPU效能測試,以及記憶體分配與傳輸速度測試,這裡就不介紹了。

總結起來sysbench的缺點就是,模擬的表結構太簡單,不像tpcc-mysql那樣完整的事務系統。但對於效能壓測對比還是很有用的,因為sysbench使用的環境引數限制是一樣的。

4. 參考

相關推薦

使用sysbenchmysql壓力測試

sysbench是一個模組化的、跨平臺、多執行緒基準測試工具,主要用於評估測試各種不同系統引數下的資料庫負載情況。關於這個專案的詳細介紹請看:https://github.com/akopytov/sysbench 。 它主要包括以下幾種方式的測試: cpu效能 磁碟

sysbenchmysql壓力測試的詳細教程

前言 在對網站整體效能進行benchmark時,可以使用多種工具,比如大名鼎鼎的ab(Apache bench),http_load等工具。這裡我們不關注他們的使用,如果你想了解,可以自行在網上找到答案。 重點來說MySQL的基準測試如何進行,也有很多種工具來供我們選擇,比

MySQL】【壓測】使用sysbenchMySQL進行壓力測試

usr with sleep library val repos then plot 停止 1.背景 ? 出自percona公司,是一款多線程系統壓測工具,可以根據影響數據庫服務器性能的各種因素來評估系統的性能。例如,可以用來測試文件IO,操作系統調度器,內存分配和傳輸

sysbenchmysql資料庫進行壓力測試

轉載請註明出處:https://blog.csdn.net/qq_30186661/article/details/80224301一、安裝sysbench平臺:ubuntucurl -s https://packagecloud.io/install/repositorie

sysbench壓力測試mysql壓力測試

sysbench壓力測試工具簡介: sysbench是一個開源的、模組化的、跨平臺的多執行緒效能測試工具,可以用來進行CPU、記憶體、磁碟I/O、執行緒、資料庫的效能測試。目前支援的資料庫有MySQL、Oracle和PostgreSQL。以下操作都將以支援My

JMeter進行簡單的數據庫(mysql)壓力測試

點擊 監聽器 ati 命名 -1 lib conn java-5 logs 1、點擊測試計劃,再點擊“瀏覽”,把JDBC驅動添加進來: 註:JDBC驅動一般的位置在java的安裝地址下,路徑類似於: \java\jre\lib\ext 文件為:m

mysql壓力測試工具

mysql壓力測試工具mysql自帶就有一個叫mysqlslap的壓力測試工具,還是模擬的不錯的。下面舉例說說。mysqlslap是從5.1.4版開始的一個MySQL官方提供的壓力測試工具。通過模擬多個並發客戶端訪問MySQL來執行壓力測試,同時詳細的提供了“高負荷攻擊MySQL”的數據性能報告。並且能很好的

[搬運工系列]-JMeter(十三)壓力測試--資料庫(mysql)壓力測試

1、點選測試計劃,再點選“瀏覽”,把JDBC驅動新增進來:   注:JDBC驅動一般的位置在java的安裝地址下,路徑類似於:    \java\jre\lib\ext         檔案為:mysql-connect

sysbenchMySQL的壓測,使用sysbench壓測磁碟io

QPS - query per secondTPS - transaction per second 不是特別關注,每個業務場景中事務標準是不一樣的 Ⅰ、sysbench測試框架 Ⅱ、常用測試指令碼 [[email protected]_42_63_centos lua]# pwd /us

sysbenchMySQL的壓測,使用sysbench壓測磁盤io

onf possible inf bubuko 最新版本 number 現在 nbsp tis QPS - query per secondTPS - transaction per second 不是特別關註,每個業務場景中事務標準是不一樣的 Ⅰ、sysbench測試框架

ab和jmeter進行GET/POST壓力測試的使用心得和比較(轉載,在ubuntu16.04下使用ab帶jsoncentos7壓力測試驗證可用)

引言: 網際網路服務壓測是非常重要的評價方法,ab,webbench,jmeter等都是業界流行的測試工具,ab和webbench作為shell模式下輕量級的測試工具,jmeter則作為有GUI介面的更高階測試工具,各有特點,ab比webbench功能更多一些,所以這裡選擇

Mysql 壓力測試工具 mysqlslap

       mysqlslap 示例             01 簡單用法           對資料庫做一個簡單的自動測試        mysqlslap --user=root --password=111111 --auto-generate-sql         --auto-generate

mysql壓力測試軟體sysbench

#我們下載mysql的壓力測試軟體sysbench [email protected]_test ~]# wget https://downloads.mysql.com/source/sysbench-0.4.12.14.tar.gz #解壓安裝 [[email protect

用mysqlslapMySQL進行壓力測試

MySQL5.1地的確提供了好多有力的工具來幫助我們DBA進行資料庫管理。現在看一下這個壓力測試工具mysqlslap.關於他的選項手冊上以及--help介紹的很詳細。我解釋一下一些常用的選項。這裡要注意的幾個選項:--concurrency代表併發數量,多個可以用逗號隔開

mysqlmysql數據庫壓力測試工具(mysqlslap)

root .cn this 用戶 cas bench 測試 逗號 complete mysqlslap是從MySQL的5.1.4版開始就開始官方提供的壓力測試工具。通過模擬多個並發客戶端並發訪問MySQL來執行壓力測試,同時提供了較詳細的SQL執行數據性能報告,並且能很好的

Jmeter基於websocket協議的壓力測試

等待時間 ads 響應消息 一次 .org 完成 毫秒 新的 字節 Jmeter對基於websocket協議的壓力測試 WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信(full-duplex)。

詳解MySQL基準測試sysbench工具

threads 組件 程序 原因 str 前言 全面 無法連接 不同 前言 作為一名後臺開發,對數據庫進行基準測試,以掌握數據庫的性能情況是非常必要的。本文介紹了MySQL基準測試的基本概念,以及使用sysbench對MySQL進行基準測試的詳細方法。 文章有疏漏之處,歡迎

詳解MySQL基準測試sysbench工具(轉)

lua 增刪 後臺 simple ads 執行時間 bench 進行 響應 前言 作為一名後臺開發,對數據庫進行基準測試,以掌握數據庫的性能情況是非常必要的。本文介紹了MySQL基準測試的基本概念,以及使用sysbench對MySQL進行基準測試的詳細方法。 文章有疏漏

(轉)用mysql自帶工具mysqlslap對數據庫進行壓力測試

執行 fec syntax counter stat autoload show 多少 creat http://aolens.blog.51cto.com/7021142/1901557-------用mysql自帶工具mysqlslap對數據庫進行壓力測試 mysqls

mysql+mycat壓力測試一例

mysql mycat sysbench前言有很多人擔心生產系統上新東西的程序怕壓力跟不上和穩定性不行,是的,大家都怕,所以領導要求做一次壓力測試,我個人也覺得是有必要的.如果按原理來說,mycat如果不做分片,純粹只是代理的話,他所做的事情,其實更多的是數據轉發,而這個轉發能力,當然就是看他能有多強.既然理