資料庫壓力測試方法小結
一、前言
在前面的壓力測試過程中,主要關注的是對介面以及伺服器硬體效能進行壓力測試,評估請求介面和硬體效能對服務的影響。但是對於多數Web應用來說,整個系統的瓶頸在於資料庫。
原因很簡單:Web應用中的其他因素,例如網路頻寬、負載均衡節點、應用伺服器(包括CPU、記憶體、硬碟、連線數等)、快取,都很容易通過水平的擴充套件(俗稱加機器)來實現效能的提高。而對於MySQL,由於資料一致性的要求,無法通過增加機器來分散向資料庫寫資料帶來的壓力;雖然可以通過前置快取(Redis等)、讀寫分離、分庫分表來減輕壓力,但是與系統其它元件的水平擴充套件相比,受到了太多的限制
二,常見的資料庫壓測指標
與介面壓測指標類似,資料庫相關指標如下:
-
TPS/QPS:衡量吞吐量。
-
響應時間:包括平均響應時間、最小響應時間、最大響應時間、時間百分比等,其中時間百分比參考意義較大,如前95%的請求的最大響應時間。。
-
併發量:同時處理的查詢請求的數量。
三,使用sybench進行資料庫壓測
1、基本介紹
sysbench是跨平臺的基準測試工具,支援多執行緒,支援多種資料庫;主要包括以下幾種測試:
-
cpu效能
-
磁碟io效能
-
排程程式效能
-
記憶體分配及傳輸速度
-
POSIX執行緒效能
-
資料庫效能(OLTP基準測試)
該工具可以自動幫你在資料庫裡構造出來大量的資料,你想要多少資料,就自動給你構造出來多少條資料。同時還可以模擬幾千個執行緒併發的訪問資料庫,模擬使用各種各樣的 SQL 語句,包括模擬出來各種事務提交到你的資料庫裡去,甚至可以模擬出幾十萬的 TPS 去壓測資料庫。
2、安裝sysbench:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
sysbench --version
3、基於 sysbench 構造測試表和測試資料:
-
首先需要在自己的資料庫裡建立好一個測試庫,我們可以取個名字叫做 test,同時建立好對應的測試賬號,可以叫做 root,密碼是 123456,讓這個使用者有許可權可以訪問 test。
-
基於 sysbench 構建 20 個測試表,每個表裡有 100 萬條資料,接著使用 100 個併發執行緒去對這個資料庫發起訪問,連續訪問 5 分鐘,也就是 300 秒。命令如下:
sysbench --db-driver=mysql --time=300 --threads=100 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare
4、執行測試:
(1)測試資料庫的綜合讀寫 TPS,使用的是 oltp_read_write 模式:
sysbench --db-driver=mysql --time=300 --threads=100 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run
(2)測試資料庫的只讀效能,使用的是 oltp_read_only模式:
sysbench --db-driver=mysql --time=300 --threads=100 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_only --db-ps-mode=disable run
(3)測試資料庫的寫入效能,使用的是 oltp_write_only 模式:
sysbench --db-driver=mysql --time=300 --threads=100 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_write_only --db-ps-mode=disable run
使用上面的命令,sysbench 工具會根據你的指令構造出各種各樣的 SQL 語句去更新或者查詢你的 20 張測試表裡的資料,同時監測出你的資料庫的壓測效能指標,最後完成壓測之後,可以執行 cleanup 命令,清理資料。
5、壓測結果分析:
按照我們上面的命令,我們是讓它每隔 1 秒都會輸出一次壓測報告的,此時它每隔一秒會輸出類似下面的一段東西:
[ 10s ] thds: 100 tps: 500 qps: 5000 (r/w/o: 3500/1000/500) lat (ms, 95%): 20 err/s: 0.00 reconn/s: 0.00
-
thds:100,這個意思就是有 100 個執行緒在壓測
-
tps:500,這個意思就是每秒執行了 500 個事務
-
qps:5000,這個意思就是每秒可以執行 5000 個請求
-
(r/w/o: 3500/1000/500):這個意思就是說,在每秒 5000 個請求中,有 3500 個請求是讀請求,1000 個請求是寫請求,500 個請求是其他的請求,就是對 QPS 進行了拆解
-
lat (ms, 95%):20,這個意思就是說,95% 的請求的延遲都在 20 毫秒以下
-
err/s: 0.00 reconn/s: 0.00:這兩個的意思就是說,每秒有 0 個請求是失敗的,發生了 0 次網路重連
-
結束語
使用sysbench工具可以直接對資料庫效能進行評價,但是在結果展示方面還有待進一步提升。當然後續可以對結果進行進一步處理,比如寫入表格或作圖,會更加直觀。