1. 程式人生 > >Sysbench測試神器:一條命令生成百萬級測試資料

Sysbench測試神器:一條命令生成百萬級測試資料

# 1. 基準測試 `基準測試(benchmarking)`是效能測試的一種型別,強調的是對一類測試物件的某些效能指標進行定量的、可復現、可對比的測試。 ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2v76qkpyj308c08c0t0.jpg) 進一步來理解,`基準測試`是在某個時候通過基準測試建立一個已知的效能水平(稱為基準線),當系統的軟硬體環境發生變化之後再進行一次基準測試以確定那些變化對效能的影響,這也是基準測試最常見的用途。其他用途包括測定某種負載水平下的效能極限、管理系統或環境的變化、發現可能導致效能問題的條件等等。 # 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 去壓測資料庫。 ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2vlyvukoj30b40b4gmc.jpg) # 6. sysbench基本語法 1、在使用前,先要需要安裝,建議在Linux下安裝sysbench ``` yum install -y sysbench ``` 2、sysbench的基本語法如下: ``` sysbench [options]... [testname] [command] ``` ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2vq8t3m8j30x90mdgqi.jpg) 其中,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`基準測試技能,在筆者的`全棧測試開發訓練營`資料庫版塊中,對訓練營的學員有過專題介紹,本文算是給公號讀者送福利了。 ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2w4tv7k8j30dw0dwq3k.jpg) **操作方法:** 1、在基準測試prepare準備階段,先建立預設的測試庫,例如`sysbench_test`: ``` mysql> create database sysbench_test; #建立資料庫 ``` 如此處,建立sysbench_test資料庫 ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2w6pu940j306v04a74a.jpg) 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`: 連線的測試資料庫名稱。 其它幾項引數較為簡單,就不一一介紹了。 執行上述命令後,輸出如下: ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2wcow4axj31gu0fi0xr.jpg) 命令執行成功後,可以開啟資料庫檢視生成的資料是否和設定的對應: ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2wdi74ckj30w00jo0yg.jpg) 可以看到,已經自動生成了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`值調大一些。 輸出資訊類似如下: ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gk2wk3bvoaj30p90kvafp.jpg) 其中,對於我們比較重要的資訊包括: - `queries`:查詢總數及qps - `transactions`:事務總數及tps - `Latency-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 ``` 如果覺得有用,**幫忙點個好看**或**朋友圈轉發分享**一下