Sysbench介紹概括總結【重要】


概念介紹

sysbench是一個模塊化的、跨平台、多線程基准測試工具,主要用於評估測試各種不同系統參數下的數據庫負載情況,它主要包括以下幾種方式的測試:磁盤io性能、數據庫性能、內存分配及傳輸速度等,詳細的介紹見https://github.com/akopytov/sysbench

它主要包括以下幾種方式的測試:
  1、cpu性能
  2、磁盤io性能
  3、調度程序性能
  4、內存分配及傳輸速度
  5、POSIX線程性能
  6、數據庫性能(OLTP基准測試)
目前sysbench主要支持 MySQL,pgsql,oracle 這3種數據庫
 
以下主要介紹對於OLTP的測試使用,基於sysbench 1.0.18版本

下載安裝

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

注意事項(重要):

  1. 如果運行程序命令時,如果當前總執行時間已經達到--time選項參數值(默認10秒),不管當前已執行事件總數是否達到--events選項參數值,都會停止運行程序,所以如果需要為程序命令顯示指定--events選項時,需要合理的設置--time選項參數值。
  2. 如果運行程序命令時,如果當前已執行事件總數已達到--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):   執行耗時(平均每個線程執行事件耗時/標准差)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM