【總結】簡述 MySQL 基準測試工具

來杯可樂不加糖發表於2019-07-17

定義:
    
基準測試是一種測量和評估軟體效能指標的活動,用於建立某個時刻的效能基準,以便當系統發生軟硬體變化時,重新進行基準測試以評估變化對效能的影響。

區別:

基準測試是針對系統設定的一種壓力測試。(簡化的壓力測試:直接、簡單、易於比較,用於評估伺服器的處理能力。不關心業務邏輯,所使用的查詢和業務的真實性可以和業務環境沒關係)

壓力測試是對真實的業務資料進行測試,獲得真實系統所能承受的壓力。(需要不同主題所使用的資料和查詢也是真實用到的)

目的:

  • 建立MySQL伺服器的效能基準線 (確認當前MySQL伺服器執行情況)
  • 模擬比當前系統更高的負載,以找出系統的擴充套件瓶頸  (增加資料庫併發,觀察QPS,TPS變化,確定併發量與效能最優的關係)
  • 測試不同的硬體、軟體和作業系統配置   (軟硬體對資料庫效能的影響)
  • 證明新的硬體裝置是否配置正確

常見指標:

  • 單位時間內所處理的事務數(TPS)
  • 單位時間內所處理的查詢數(QPS)
  • 響應時間(us,ms,s等)
    • 平均響應時間
    • 最小響應時間
    • 最大響應時間
  • 各時間所佔百分比(最有參考意義)
  • 併發量 (同時處理的查詢請求的數量)
    • 注:併發量不等於連線數
    • 注:需要關注的是正在工作中的併發的運算元或同時工作的數量

計劃和設計基準測試

  • 對整個系統還是某一元件
  • 使用什麼樣的資料
    • 反應系統實際情況則需要
      • 生產環境資料與生產環境SQL
      • 生產資料備份
      • 測試時間段內產生的SQL日誌多效能的回放
      • 相對複雜
    • 引數調整對效能的影響只需要
      • 測試工具完成
  • 計算測試時間和次數
  • 準備基準測試及資料收集指令碼(收集一下資訊)
    • CPU使用率
    • IO
    • 網路流量
    • 狀態與計數器資訊等
    • 指令碼:Get_Test_Info.sh
  • 執行基準測試
  • 儲存及分析基準測試結果

基準測試中容易忽略的問題:

  • 在生產環境資料時只使用了部分資料
  • 在多使用者場景中,只做了單使用者的測試(推薦使用多執行緒併發測試)
  • 單伺服器上測試分散式應用(推薦使用相同架構的測試)
  • 反覆執行同一查詢(容易快取命中,無法反應真實查詢效能)

系統測試:

  • Apache Bench
  • Httpload

MySQL測試:

  • mysqlslap
  • sysbench

下文重點講述MySQL測試。

MySQLSLAP:

MySQL伺服器自帶的基準測試工具,隨MySQL 一起安裝

特點:

  • 可以模擬伺服器負載,並輸出相關統計資訊
  • 可以指定也可以自動生成查詢語句

缺點:

  • innodb建立無索引(不通用)
  • 無法對伺服器硬體測試(CPU 、I/O、 記憶體)\

引數:

--auto-generate-sql                       #由系統自動生成SQL指令碼進行測試 
--auto-generate-sql-add-autoincrement     #在生成的表中增加自增ID
--auto-generate-sql-load-type             #指定測試中使用的查詢型別
--auto-generate-sql-write-number          #指定初始化資料時生成的資料量
--concurrency                             #指定併發執行緒的數量,可用逗號分隔
--engine                                  #指定要測試表的儲存引擎,可以用逗號分割多個儲存引擎
--no-drop                                 #指定不清理測試資料
--iterations                              #指定測試執行次數(若設定,則no-drop無效)
--number-of-queries                       #指定每一個執行緒執行的查詢數量
--debug-info                              #指定輸出額外的記憶體及CPU統計資訊
--number-int-cols                         #指定測試表中包含的INT型別列的數量
--number-char-cols                        #指定測試表中包含的varchar型別的數量
--create-schema                           #指定了用於執行測試的資料庫的名字
--query                                   #用於指定自定義SQL的指令碼(儲存)
--only-print                              #並不執行測試指令碼,而是把生成的指令碼列印出來

檢視更多引數:mysqlslap --help


舉例:

1、建立測試賬號或直接使用原有賬號密碼:grant all privileges on  *.* to [db_username]@'localhost' identified by [db_password];

2、命令:mysqlslap  -hlocalhost -u[資料庫賬號] -p[資料庫密碼] -P3306 --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=stest

3、列印指令碼:mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=sbtest --only-print  >        test.log

如圖:

SYSBENCH:

特點:

  • 常用測試工具(適合innodb測試)
  • 可以對伺服器硬體測試(CPU 、I/O、 記憶體)

安裝:

1、wget https://github.com/akopytov/sysbench/archive/0.5.zip
2、unzip sysbench-0.5.zip
3、cd sysbench
4、./autogen.sh
5、./configure --with-mysql-includes=/usr/local/mysql/include/ \--with-mysql-libs=/usr/local/mysql/lib/      (指定mysql下include目錄和libs目錄)
6、make && make install
7、sysbench --help //檢查是否安裝成功(如下圖所示,則表示安裝成功)


常用引數:

-- test                    #用於指定索要執行的測試型別,支援以下引數:
    Fileio                   #檔案系統I/O效能測試 
    cpu                      #CPU效能測試
    memory                   #記憶體效能測試
    Oltp                     #測試要指定具體的lua指令碼(lua指令碼位於 sysbench-0.5/sysbench/tests/db)
--mysql-db                 #用於指定執行基準測試的資料庫名
--mysql-table-engine       #用於指定所使用的儲存引擎
--oltp-tables-count        #執行測試的表的數量
--oltp-table-size          #指定每個表中的資料行數
--num-threads              #指定測試的併發執行緒數量
--max-time                 #指定最大的測試時間
--max-requests             #請求的最大數目,0表示不限制
--thread-stack-size        #每個執行緒的堆疊大小 32K
--init-rng                 #在測試開始之前指定是否需要初始化隨機數發生器 off
--report-interval          #指定間隔多長時間輸出一次統計資訊
--test                     #指定測試專案名稱   Required
--debug                    #是否顯示更多的除錯資訊   off
--validate                 #在可能的情況下是否進行驗證檢查    off 
--help                     #幫助資訊   off
--verbosity                #詳細級別,0-嚴重資訊,5-除錯資訊
--percentile               #表示設定取樣比例,預設是 95%,即丟棄1%的長請求,在剩餘的99%裡取最大值
--mysql-user               #指定執行測試的MySQL使用者
--mysql-password           #指定執行測試的MySQL使用者的密碼 
prepare                    #用於準備測試資料
run                        #用於實際進行測試
cleanup                    #用於清理測試資料

舉例:

A、測試CPU      

sysbench --test=cpu --cpu-max-prime=10000 run   
 #CPU測試使用64位整數,測試計算質數直到某個最大值所需要的時間,
 #cpu測試主要是進行素數的加法運算,在上面的例子中,
 #指定了最大的素數為 20000,自己可以根據機器cpu的效能來適當調整數值,
 #主要看total time所花費的時間

如圖:

B、測試執行緒

sysbench  --test=threads --num-threads=800 --thread-yields=100 --thread-locks=10 run
#thread-locks小於執行緒數除以2,lock越少,處理時間越長

C、測試IO

1、檢視記憶體:free -m 
2、檢視磁碟空間:df -lh   如圖1所示
3、建立測試資料夾,準備測試資料:sysbench --test=fileio --file-total-size=1G prepare
4、檢視fileio的引數:sysbench --test=fileio --help                                                   
5、sysbench --test=fileio --num-threads=8 --init-rng=on --file-total-size=1G --file-test-mode=rndrw --report-interval=1 run
#如圖2所示

如圖所示:

圖1:

圖2:

D、測試OTLP

建立測試環境
1、建立測試資料庫:create database base_test;
2、建立測試賬戶:grant all privileges on  *.* to [db_username]@'localhost' identified by ['db_password'];
進入sysbench:cd /sysbench-0.5/sysbench/tests
準備命令:sysbench --test=./oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=base_test --mysql-user=[db_username]--mysql-password=[db_password] --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock   prepare
執行監聽指令碼:bash ./Get_Test_info.sh &
檢視指令碼執行狀態:ps -ef
測試命令:sysbench --test=./oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=base_test --mysql-user=[db_username]--mysql-password=[db_password] --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock   run

檢視測試效果:
  1、在資料庫中:show processlist
  2、檢視測試資訊(Get_Test_info.sh裡面指定資料夾)  //列印 TS TS 1563176835.003951886 2019-07-15 15:47:15
  3、收集完成後停止指令碼收集命令:rm -rf running
  4、分析收集資訊:./analyze.sh  /base_test/sysbench/benchmarks/5-sec-status-2019-07-15_03-status
注:
檢視檔案位置:
  find / -name mysql | mysql.sock | oltp.lua
  whereis mysql等方法 
獲取指令碼:
  Get_Test_info.sh中路徑需要修改為系統實際路徑

關注公眾號,後臺回覆指令碼,獲取shell指令碼(analyze.sh,Get_Test_info.sh)

來杯可樂不加糖。

相關文章