1. 基准測試
基准測試(benchmarking)
是性能測試的一種類型,強調的是對一類測試對象的某些性能指標進行定量的、可復現、可對比的測試。
進一步來理解,基准測試
是在某個時候通過基准測試建立一個已知的性能水平(稱為基准線),當系統的軟硬件環境發生變化之后再進行一次基准測試以確定那些變化對性能的影響,這也是基准測試最常見的用途。其他用途包括測定某種負載水平下的性能極限、管理系統或環境的變化、發現可能導致性能問題的條件等等。
2. 基准測試的作用
對於大多數Web應用而言,系統的瓶頸往往很容易發生在數據庫端,原因很簡單:Web應用中的其他因素,例如網絡帶寬、負載均衡節點、應用服務器(包括CPU、內存、硬盤燈、連接數等)、緩存,都很容易通過水平的擴展(俗稱加機器)來實現性能的提高。而對於數據庫如MySQL
,由於數據一致性的要求,無法通過增加機器來分散向數據庫寫數據帶來的壓力;雖然可以通過前置緩存(Redis等)、讀寫分離、分庫分表來減輕壓力,但是與系統其它組件的水平擴展相比,受到了太多的限制。
而對數據庫的基准測試的作用,就是分析在當前的配置下(包括硬件配置、OS、數據庫設置等),數據庫的性能表現,從而找出數據庫的性能閾值,並根據實際系統的要求調整配置。除此之外,對數據庫服務器進行基准測試,也通常用於觀察對比數據庫結構修改之前以及修改之后,其性能會受到什么樣的影響。
3. 基准測試與壓力測試區別
很多時候,基准測試和壓力測試在實際使用的過程中,很容易被弄混淆。基准測試可以理解為針對系統的一種壓力測試。但基准測試不關心業務邏輯,更加簡單、直接、易於測試,數據可以由工具生成,不要求真實;而壓力測試一般考慮業務邏輯(如購物車業務),要求真實的數據。
4. 基准測試的指標及工具
常見的數據庫指標包括:
- TPS/QPS:主要用於衡量吞吐量。
- 響應時間:包括平均響應時間、最小響應時間、最大響應時間、時間百分比等,其中時間百分比參考意義較大,如前95%的請求的最大響應時間。
- 並發量:同時處理的查詢請求的數量。
如果只是針對數據庫服務器,例如只針對MySQL數據庫開展基准測試,一般可以使用專門的工具進行,例如mysqlslap
、sysbench
等。
mysqlslap
是MySQL5.1.4之后自帶的benchmark基准測試工具,該工具可以模擬多個客戶端同時並發的向服務器發出查詢更新,給出了性能測試數據而且提供了多種引擎的性能比較。
其中,sysbench
比mysqlslap
更通用、更強大,本文將給大家介紹如何使用sysbench來開展基准測試,之所以說它是測試神器,是因為除了能對利用它對各類基礎設施對象開展基准測試以外,還可以利用它的實現思路幫助我們生成成百上千萬的測試數據,往下看,一起來揭秘吧~
5. sysbench基准測試
sysbench
是一個模塊化的、跨平台、多線程基准測試工具,主要用於評估測試各種不同系統參數下的數據庫負載情況,它主要包括以下幾種方式的測試:
- cpu性能
- 磁盤io性能
- 調度程序性能
- 內存分配及傳輸速度
- POSIX線程性能
- 數據庫性能(OLTP基准測試)
目前sysbench主要支持MySQL
,pgsql
,Oracle
這3類數據庫
默認支持MySQL,如果需要測試Oracle/PostgreSQL,則在configure時需要加上–with-oracle
或者–with-pgsql
參數.
通過sysbench工具對數據庫開展基准測試最大的亮點在於:可以自動幫你在數據庫里構造出來大量的數據,你想要多少數據,就自動給你構造出來多少條數據。同時還可以模擬幾千個線程並發的訪問數據庫,模擬使用各種各樣的 SQL 語句,包括模擬出來各種事務提交到你的數據庫里去,甚至可以模擬出幾十萬的 TPS 去壓測數據庫。
6. sysbench基本語法
1、在使用前,先要需要安裝,建議在Linux下安裝sysbench
yum install -y sysbench
2、sysbench的基本語法如下:
sysbench [options]... [testname] [command]
其中,command是sysbench
要執行的命令,包括prepare
、run
和cleanup
。
顧名思義:
- prepare是為測試提前准備數據
- run是執行正式的測試
- cleanup是在測試完成后對數據庫進行清理。
testname指定了要進行的測試,在老版本的sysbench中,可以通過--test參數指定測試的腳本;而在新版本中,--test參數已經聲明為廢棄,可以不使用--test,而是直接指定腳本。
如下兩種方法效果是一樣的:
sysbench --test=./tests/include/oltp_legacy/oltp.lua
sysbench ./tests/include/oltp_legacy/oltp.lua
測試時使用的腳本為lua腳本,可以使用sysbench自帶腳本,也可以自己開發。對於大多數應用,使用sysbench自帶的腳本就足夠了。不同版本的sysbench中,lua腳本的位置可能不同,可以自己在sysbench路徑下使用find命令搜索oltp.lua
。
大多數數據服務都是oltp類型的,如果你不了解什么是oltp,那么大概率你的數據服務就是oltp類型的。
7. sysbench使用實踐(一鍵構建百萬級數據)
接下來,給大家演示一下,如何使用sysbench來對MySQL開展基准測試,以及如何利用sysbench
一條命令來構建百萬級測試數據。
注:sysbench
基准測試技能,在筆者的全棧測試開發訓練營
數據庫版塊中,對訓練營的學員有過專題介紹,本文算是給公號讀者送福利了。
操作方法:
1、在基准測試prepare准備階段,先創建默認的測試庫,例如sysbench_test
:
mysql> create database sysbench_test; #創建數據庫
如此處,創建sysbench_test數據庫
2、准備數據,時間比較長,本文主要為了演示方法,因此把table_size設置的小一點
sysbench /usr/share/sysbench/oltp_read_write.lua --tables=5 --table_size=100 --mysql-user=root --mysql-password=xxx --mysql-host=192.168.0.103 --mysql-port=3306 --mysql-db=sysbench_test prepare
其中,幾個關鍵參數:
--tables
:指定生成表的數量,此處設置了5張表,表明生成5張測試表,讀者可根據實際需要,調整此值。--table_size
:指定生成表中生成的數據量,上述例子,表明每張表生成100條測試數據,實際可以根據需要調整引值,比如調整為:1000000,即代表生成一百萬條測試數據。--mysql-db
: 連接的測試數據庫名稱。
其它幾項參數較為簡單,就不一一介紹了。
執行上述命令后,輸出如下:
命令執行成功后,可以打開數據庫查看生成的數據是否和設置的對應:
可以看到,已經自動生成了100條測試數據了,如果需要一鍵成生成百萬條測試數據,只需要將--table_size=100
修改為 --table_size=1000000
即可。
3、選擇一個lua腳本進行測試,如驗證讀寫性能,執行命令如下:
sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-user=root --mysql-password=xxx --mysql-host=192.168.0.103 --mysql-port=3306 --mysql-db=sysbench_test --tables=5 --table_size=100 --threads=10 --time=30 --report-interval=3 run
上述命令,表明使用了10個並發線程數,執行時間為30秒,每3秒輸出一次測試信息。
實際讀者可以將--threads=10
和--time=30
值調大一些。
輸出信息類似如下:
其中,對於我們比較重要的信息包括:
queries
:查詢總數及qpstransactions
:事務總數及tpsLatency-95th percentile
:前95%的請求的響應時間。
4、執行完測試,拿到所需要的測試結后,最后一步,記得要清理數據,否則后面的測試可能會受到影響。
sysbench /usr/share/sysbench/oltp_read_write.lua --tables=5 --table_size=100 --mysql-user=root --mysql-password=xxx --mysql-host=192.168.0.103 --mysql-port=3306 --mysql-db=sysbench_test cleanup
如果覺得有用,幫忙點個好看或朋友圈轉發分享一下就行。