概念介紹
sysbench是一個模塊化的、跨平台、多線程基准測試工具,主要用於評估測試各種不同系統參數下的數據庫負載情況,它主要包括以下幾種方式的測試:磁盤io性能、數據庫性能、內存分配及傳輸速度等,詳細的介紹見https://github.com/akopytov/sysbench
1、cpu性能
2、磁盤io性能
3、調度程序性能
4、內存分配及傳輸速度
5、POSIX線程性能
6、數據庫性能(OLTP基准測試)
目前sysbench主要支持 MySQL,pgsql,oracle 這3種數據庫
下載安裝
unbun安裝方法,centos的安裝詳見:https://github.com/akopytov/sysbench#debianubuntu 注意查看【從二進制包安裝】
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
檢查安裝是否成功
sysbench --version
安裝后檢查腳本存放路徑
/usr/share/doc/sysbench/ #存放着各種腳本
想要看其他安裝的路徑,使用如下方式
whereis sysbench
(注)得出的結果為:sysbench: /usr/bin/sysbench /usr/share/sysbench /usr/share/man/man1/sysbench.1.gz /usr/share/doc/sysbench/
支持的腳本
bulk_insert.lua* oltp_000.lua oltp_common.lua oltp_delete.lua* oltp_insert.lua* oltp_point_select.lua* oltp_read_only.lua* oltp_read_write.lua* oltp_update_index.lua* oltp_update_non_index.lua* oltp_write_only.lua* select_random_points.lua* select_random_ranges.lua*
測試語法
--point_selects:主鍵等值查詢 SELECT c FROM sbtest%u WHERE id=? -- simple_ranges:簡單范圍查詢(主鍵range) SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? -- sum_ranges:范圍求和(簡單范圍查詢的基礎上做sum) SELECT SUM(k) FROM sbtest%u WHERE id BETWEEN ? AND ? -- order_ranges:簡單范圍查詢(主鍵range的基礎上做排序) SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c -- distinct_ranges:去重范圍查詢(主鍵range + 排序 + 去重) SELECT DISTINCT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c -- index_updates:索引更新操作 UPDATE sbtest%u SET k=k+1 WHERE id=? -- non_index_updates:非索引更新 UPDATE sbtest%u SET c=? WHERE id=? -- deletes:刪除操作 DELETE FROM sbtest%u WHERE id=? -- inserts:插入操作 INSERT INTO sbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)
性能指標
標准的性能指標
TPS:每秒執行事務數TPS(Transactions Per Second),數據庫每秒執行的事務數,以COMMIT成功次數為准
- SysBench標准OLTP讀寫混合場景中一個事務包含18個讀寫SQL。
- SysBench標准OLTP只讀場景中一個事務包含14個讀SQL(10條主鍵點查詢、4條范圍查詢)。
- SysBench標准OLTP只寫場景中一個事務包含4個寫SQL(2條UPDATE、1條DETELE、1條INSERT)
QPS:每秒執行請求數QPS(Queries Per Second),數據庫每秒執行的SQL數,包含INSERT、SELECT、UPDATE、DETELE、COMMIT等。
Latency (ms):95th percentile
不同場景的性能指標
讀寫場景壓測
- TPS:對應測試結果的transactions(xx per sec)
- QPS:對應測試結果的queries
- 數據庫讀寫時每秒執行的SQL數(含insert、select、update)
- 響應時間(RT):對應Latency(ms)的95th percentile
只讀場景壓測
- QPS:對應測試結果的queries
- 數據庫只讀時每秒執行的SQL數(僅包含select)
- 響應時間(RT):對應Latency(ms)的95th percentile
只寫場景壓測
- TPS:對應測試結果的transactions
- 響應時間(RT):對應Latency(ms)的95th percentile
不同並發下的壓測,找出每個測試場景的並發峰值
詳細的並發下測試找峰值的方法見: https://www.cnblogs.com/syw20170419/p/16261768.html
如果想要提高寫入效率,我們可以使用批量寫入,這樣一批寫入的記錄條數越多,插入效率就會越高,但需要注意的是,批量寫入一條記錄不能超過 48 KB,一條 SQL 語句總長度不能超過 1MB。此外,支持多線程同時寫入,要注意:線程數達到一定數量后將無法再提高,甚至還會下降,因為線程頻繁切換會帶來額外開銷。
insert等其他場景創建表的SQL
Create Table `sbtest2` ( `id` bigint NOT NULL AUTO_INCREMENT, `k` int NOT NULL DEFAULT '0', `c` varchar NOT NULL DEFAULT '', `pad` varchar NOT NULL DEFAULT '', primary key (id) ) DISTRIBUTE BY HASH(`id`) INDEX_ALL='Y'
bulk insert的建表SQL
Create Table `sbtest1` ( `id` int NOT NULL, `k` int NOT NULL DEFAULT '0', primary key (id) ) DISTRIBUTE BY HASH(`id`) INDEX_ALL='Y'
測試的步驟
prepare:測試前准備工作(生成測試需要的數據);
run:進行性能測試
cleanup:測試后刪掉測試數據
說明:每個不同類型的測試均按照如上的步驟進行執行,避免上次的測試結果會影響到下一次的執行,示例:執行oltp_insert的測試,想要測試3遍計算得出平均值,那么如上的測試步驟需要分別執行3次。
執行腳本(insert示例)
注意:每個不同類型的測試,給定的參數不一樣,一定要注意檢查,每個不同類型具體怎么測試,會在后面的文章中進行詳細解釋
##准備數據 sysbench /usr/share/sysbench/oltp_insert.lua --tables=5 --table_size=100 --mysql-host=192.168.30.118 --mysql-port=3001 --mysql-db=syw_sysbench --mysql-user=kepler --mysql-password=afdd0b4ad2ec172c586e2150770fbf9e prepare ##運行測試 sysbench /usr/share/sysbench/oltp_insert.lua --tables=5 --table_size=100 --threads=5 --mysql-host=192.168.30.118 --mysql-port=3001 --mysql-db=syw_sysbench --mysql-user=kepler --mysql-password=afdd0b4ad2ec172c586e2150770fbf9e --create_secondary=off --time=30 --report-interval=3 run ##清理數據 sysbench /usr/share/sysbench/oltp_insert.lua --tables=5 --table_size=100 --threads=5 --mysql-host=192.168.30.118 --mysql-port=3001 --mysql-db=syw_sysbench --mysql-user=kepler --mysql-password=afdd0b4ad2ec172c586e2150770fbf9e --create_secondary=off --time=30 --report-interval=3 cleanup
prepare與run注意事項
- prepare:主要由參數--table_size=100 --threads=5 --tables=5來決定執行完成的時間,此時--time=30是不起作用的
- run:主要由參數--table_size=100 --threads=5 --tables=5 --time=30來決定執行完成的時間,此時最重要的是--time=30。run 30s后才會停止。因為sysbench會在30秒內不斷的加壓來測試數據庫的性能,因此insert的數據也是不固定的
參數介紹
常用數據庫選項
--db-driver=STRING 設置程序使用的數據庫驅動。默認值 mysql
常用mysql選項
--mysql-host=host mysql服務主機地址 默認localhost --mysql-port=3306 mysql服務端口 默認值 3306 --mysql-user=STRING mysql用戶名稱 默認值 sbtest --mysql-password=STRING mysql密碼,默認值 [] --mysql-db=STRING mysql數據庫名稱 默認 sbtest
常用一般命令選項
--threads 需要創建的worker線程數量 默認值 1 --events=N 設置期望執行的事件總數。0表示不限制 默認值 0 --time=N 設置總執行時間,單位秒。0表示不限制。 默認值 10 --forced-shutdown=STRING 超過--time限制后,關閉程序之前需要等待的秒數,如果設置為off則表示不啟用。 默認值 off --rate=N 平均事務速率。 0表示不限制。默認值 0 --report-interval=N 設置定期報告中間統計的時間間隔為N,單位為秒 。 0表示不設置。默認值 0
注意事項(重要):
- 如果運行程序命令時,如果當前總執行時間已經達到
--time
選項參數值(默認10秒),不管當前已執行事件總數是否達到--events
選項參數值,都會停止運行程序,所以如果需要為程序命令顯示指定--events
選項時,需要合理的設置--time
選項參數值。 - 如果運行程序命令時,如果當前已執行事件總數已達到
--events
選項參數值,不管當前總執行時間是否達到--time
選項參數值,都會停止測試
常用日志選項
--verbosity=N 日志詳細級別 {5 - debug, 0 - 僅critical messages} 默認值 3 --percentile=N 延時統計(latency statistics)中,需要計算的百分比 (1-100)。設置為0表示禁用百分比值計算。 Use the special
sysbench oltp_insert help參數選項
注:想看其他的參數選項,語法為:sysbench XXX help,自己想看的參數替換掉xxx即可
--auto_inc[=on|off] id列默認自增,默認[on]
--create_secondary[=on|off] 索引不是主鍵索引而是二級索引,默認[off]
--delete_inserts=N 每個事務的delete、insert的組合數,默認[1]
--distinct_ranges=N 單個事務中執行范圍distinct查詢的數量,默認[1]
--index_updates=N 單個事務中執行索引更新的操作的數量,默認[1]
--mysql_storage_engine=STRING mysql的存儲引擎,默認是[innodb]
--non_index_updates=N 單個事務中執行索引更新的操作的數量,默認[1]
--order_ranges=N 單個事務中執行范圍order by查詢的數量,默認[1]
--pgsql_variant=STRING 在運行pgsql的驅動程序時,使用了pgsql的變體,當前僅僅支持的variant是'redshift',當啟動時,
將自動禁用create_secondary為不可用,並將delete_insert設置為0
--point_selects=N 單個事務中select查詢的數量,默認 [10]
--range_selects[=on|off] 啟用/禁用所有SELECT查詢[on]
--secondary[=on|off] 使用二級索引代替逐漸,默認[off]
--range_size=N 查詢范圍。默認是100
--simple_ranges=N 每個事務的簡單查詢范圍select,默認[1]
--skip_trx[=on|off] 語句以bigin/commit開始結尾,默認[off]
--sum_ranges=N 每個事務的select sum的查詢總量,默認[1]
--table_size=N 指定表的記錄大小(行的數量),默認[10000]
--tables=N 創建的表數量,默認[1]
測試結果解讀
sysbench 1.0.18: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 8 Report intermediate results every 10 second(s) Random number generator seed is 0 and will be ignored Threads started! -- 每10秒鍾報告一次測試結果,tps、每秒讀、每秒寫、99%以上的響應時長統計,此部分的內容來自於參數:--report-interval=10 [ 10s] threads: 8, tps: 1111.51, reads/s: 15568.42, writes/s: 4446.13, response time: 9.95ms (99%) [ 20s] threads: 8, tps: 1121.90, reads/s: 15709.62, writes/s: 4487.80, response time: 9.78ms (99%) [ 30s] threads: 8, tps: 1120.00, reads/s: 15679.10, writes/s: 4480.20, response time: 9.84ms (99%) [ 40s] threads: 8, tps: 1114.20, reads/s: 15599.39, writes/s: 4456.30, response time: 9.90ms (99%) [ 50s] threads: 8, tps: 1114.00, reads/s: 15593.60, writes/s: 4456.70, response time: 9.84ms (99%) [ 60s] threads: 8, tps: 1119.30, reads/s: 15671.60, writes/s: 4476.50, response time: 9.99ms (99%) SQL statistics: queries performed: 執行的SQL查詢: read: 讀請求次數 write: 寫請求次數 other: 其它請求次數 total: 總請求次數 transactions: 執行的事務總數 (每秒事務數.) queries: 執行的查詢總次數 (每秒查詢次數.) ignored errors: 忽略錯誤數 (每秒忽略錯誤次數.) reconnects: 數據庫重連次數 (每秒重連次數.) General statistics: total time: 總運行時間,以秒為單位 total number of events: 總執行事件數 Latency(毫秒為單位): min: 最小請求響應時間 avg: 平均請求響應時間 max: 最大請求響應時間 95th percentile: 95%的請求響應時間 sum: 總請求響應時間 Threads fairness: events (avg/stddev): 執行的事件總數(平均每個線程執行的事件總數/標准差) execution time (avg/stddev): 執行耗時(平均每個線程執行事件耗時/標准差)