定義:
基準測試是一種測量和評估軟體效能指標的活動,用於建立某個時刻的效能基準,以便當系統發生軟硬體變化時,重新進行基準測試以評估變化對效能的影響。
區別:
基準測試是針對系統設定的一種壓力測試。(簡化的壓力測試:直接、簡單、易於比較,用於評估伺服器的處理能力。不關心業務邏輯,所使用的查詢和業務的真實性可以和業務環境沒關係)
壓力測試是對真實的業務資料進行測試,獲得真實系統所能承受的壓力。(需要不同主題所使用的資料和查詢也是真實用到的)
目的:
- 建立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)