MySQL效能基礎測試
測試原因
為什麼需要做效能測試
- 類比比當前系統更高的負載,找出效能瓶頸
- 重現線上異常
- 測試不同硬體軟體配置
- 規劃未來的業務增長
測試分類 效能測試的分類
裝置層的測試
業務層測試
資料庫層的測試
- 什麼情況下要做Mysql的測試
-
- 測試不同的Mysql分之版本
- 測試不同的mysql版本
- 測試不同的mysql參數搭配
mysql測試分類
- CPU Bound --全記憶體的測試,測試的資料遠小於配置的記憶體;這樣就可以不用因為磁碟IO的效能不同,而影響測試結果。
- IO Bound-- 測試的資料量遠大於記憶體,這就有大量的資料從磁碟IO讀取寫入;
4小類:
- 寫入測試
- 更新測試
- 純度測試
- 混合模式(根據業務不同)
常用的測試載入器
- 開源的mysql效能測試工具
-
- sysbench
- tpcc-mysql
- mysqlslap
- 針對業務編寫效能測試工具
-
- blogbench--根據網易部落格,的具體業務來做的測試載入器
效能測試衡量指標:
- 服務輸送量
-
- TPS--每秒執行事務的總量
- QPS--每秒執行的請求總量
- 服務回應時間
- 服務並發性---正在工作中的並行作業,或者是同時工作中的線程數或者串連數。例如一個web網站"同時有50000個使用者"訪問,卻可能只有10--15個並發請求到mysql資料庫,此時並發數只有10--15。
- 可擴充性---------------簡單來說,給系統增加一倍的資源(比如兩倍的CPU數),就可以獲得兩倍的輸送量。當然,同時效能(回應時間)也必須在可以接受的範圍內。大多數系統是無法做到如此理想的線性擴充的。
測試方法 設計基準測試的常見錯誤:
- 使用真實資料的子集而不是全集。
- 與真實使用者行為不匹配。
- 沒有檢查錯誤。-----------測試中遇到不是預期結果,就應該檢查錯誤記錄檔,這時基本要求。
- 忽略了系統預熱的過程----系統重啟後,緩衝是沒有資料的,這時測試與實際情況不符,實際很可能是 緩衝中已經有很多資料。
- 測試時間太短
1 測試規劃:
- 記錄測試資料
- 系統配置的步驟
- 如何測試的步驟
- 分析結果
- 預熱的方案
應該建立將參數和結果文檔化的規範,每一輪測試都必須進行詳細記錄 2 基準測試應該運行多長時間 一個簡單的測試規則,就是等系統看起來穩定的時間至少等於系統預熱的時間。 基準測試應該運行足夠長的時間。 如果沒有實際去完成準確完整的基準測試,那麼已經花費的所有時間都是一種浪費。有時候要相信別人的測試結果,這總比做一次半拉子的測試來得到一個錯誤的結論要好。 3 擷取系統效能和狀態 需要記錄的資料包括系統狀態和效能指標:
- cpu使用率
- 磁碟I/O
- 網路流量統計
- show global status 計數器等
使用指令碼對這些資料進行收集。 基於mysql的預設配置的是沒有什麼意義,因為預設配置是基於消耗很少記憶體的極小應用的。 4 運行基準測試並分析結果 自動化基準測試,是個不錯的方案。可以是一個makefile或者一組指令碼。 要儘可能地使用所有測試過程都自動化,包括資料裝載,系統預熱,執行測試,記錄結果。等。 多次測量 5 繪圖的重要性 通過圖形可以立刻發現一些問題,而這些問題在未經處理資料中卻很難被注意到。 在執行基準測試的時候要儘可能收集更多的細節資料,然後將資料繪製成圖形,這樣可以協助快速地發現問題。 gnuplot或者R繪圖; 測試載入器 Sysbench
- 業界較為出名的效能測試工具
- 可以測試磁碟,CPU,資料庫
- 支援多種資料庫:Oracle,DB2,MYSQL
- 需要自己下載編譯安裝
- 建議版本:sysbench0.5
sysbench,不僅用來測試資料庫的效能,也可以測試回合資料庫的伺服器的效能。 強烈建議熟悉sysbench測試,在mysql使用者的工具包中,這應該是最有用的工具之一。
- sysbench 的cpu基準測試
- sysbench 的檔案I/O基準測試
- sysbench 的OLTP基準測試
sysbench 其他的基準測試,但和資料庫效能沒有直接關係。
- 記憶體-----測試記憶體的連續讀寫效能
- 線程-----測試線程調度器的效能。
- 互斥鎖---測試互斥鎖效能。
- 順序寫---測試順序寫的效能。
Tpcc-mysql
- TPC-C是專門針對聯機交易處理系統(OLTP系統)的規範
- Tpcc-mysql由percona根據規範實現
TPCC流程 更能類比線上業務使用該測試載入器:需要建立資料和表結構,載入資料,執行測試三個步驟。 benchmark()mysql的benchmark():可以測試某些特定操作的執行速度。
mysql> set @input := 'hello world';Query OK, 0 rows affected (0.00 sec) mysql> select benchmark(1000000,MD5(@input));+--------------------------------+| benchmark(1000000,MD5(@input)) |+--------------------------------+| 0 |+--------------------------------+1 row in set (1.45 sec) mysql> select benchmark(1000000,SHA1(@input));+---------------------------------+| benchmark(1000000,SHA1(@input)) |+---------------------------------+| 0 |+---------------------------------+1 row in set (1.40 sec)
雖然benchmark()函數用起來很方便,但是不適合用來做真正的基準測試,因為該函數只是簡單地返回伺服器執行運算式的時間,不會涉及分析和開銷,等因素。而且運算式必須像這個例子一樣包含使用者定義的變數(input),否則會多次執行同樣的運算式會因為系統快取命中而影響結果。 具體測試實踐,請看sysbench實踐,tpcc-mysql實踐; 總結
- 四小類:寫入測試,更新測試,純度測試,混合模式
- 效能測試衡量指標:
-
- 服務輸送量
-
- TPS--每秒執行事務的總量
- QPS--每秒執行請求的總量
- 服務回應時間
- 服務並發性
- 設計測試常見錯誤:
-
- 使用資料子集而不是全集,
- 與真實使用者行為不匹配,
- 沒有檢查錯誤,
- 忽略了系統預熱過程,測試時間太短;
- 測試方法
-
- 測試規劃:
-
- 記錄測試資料,
- 系統配置步驟,
- 測試步驟,
- 分析結果,
- 預熱方案;
- 測試時間:測試應該運行足夠長的時間,至少等於系統預熱的時間。
- 擷取系統效能和狀態:cpu,IO,網路流量,mysql狀態計數器;
- 運行測試:自動化測試包含:資料裝載,系統預熱,執行測試,記錄結果。
- 繪圖分析:直觀的發現問題;
- 測試載入器:sysbench,tpcc-mysql,benchmark()
- 測試小結:
- IO Bound測試資料量要遠大於記憶體,cpu Bound測試資料量要小於記憶體
- 測試時間建議大於60分鐘,減小誤差;有系統預熱時間;
- Sysbench更傾向於測試Mysql效能,Tpcc更接近於業務
- 運行測試程式需要同時監控機器負載,Mysql各項監控指標
本文永久更新連結地址: