一、mysql數(shù)據(jù)庫的壓測

1.名詞概念理解

QPS:

英文全稱:Query Per Second,對數(shù)據(jù)庫來說就是每秒可以處理多少個請求,可以大致理解為一次請求就是一條sql語句,也就是說這個數(shù)據(jù)庫每秒可以處理多少個sql語句。對于java應用系統(tǒng)或者一些中間件來說,就是每秒可以處理多少個請求。

TPS:

英文全稱:Transaction Per Second,就是指每秒可以處理的事務量,就是每秒有多少個事務執(zhí)行完畢。

IO相關的壓測性能指標

IOPS:

這個指的是機器的隨機IO并發(fā)處理能力,比如機器可以達到200 IOPS,意思就是說每秒可以執(zhí)行200個隨機IO讀寫請求。這個指標對mysql數(shù)據(jù)Buffer Pool中緩存數(shù)據(jù)刷入磁盤文件時特別重要,如果IOPS值比較小是,緩存數(shù)據(jù)刷入磁盤就會比較慢,因為它刷入磁盤采用對就是隨機讀寫。

吞吐量

這個指機器的磁盤存儲每秒可以讀寫多少字節(jié)的數(shù)據(jù)量。這個指標也是特別關鍵的,因為mysql在執(zhí)行sql提交事務的時候會寫redo log之類的日志文件到磁盤中,所以一臺機器每秒可以讀寫多少字節(jié)的數(shù)據(jù)量就決定了每秒可以把多少redo log之類的日志文件寫入磁盤。一般來說redo log之類的日志文件寫磁盤都是順序寫的也就是一行接著一行寫,不會說進行隨機的讀寫,那么一般普通磁盤的順序寫入吞吐量可以達到200MMB左右。所以,一般機器的磁盤吞吐量是可以承載高并發(fā)請求的。

latency

這個指往磁盤寫入一條數(shù)據(jù)的延遲

其他的性能指標

CPU負載
網(wǎng)絡負載

主要看機器的帶寬大小是多少,在壓測一定的QPS和TPS的時候,每秒鐘機器的網(wǎng)卡會輸入多少M的數(shù)據(jù)和輸出多少M的數(shù)據(jù)。因為有可能你的帶寬最多每秒傳輸100M的數(shù)據(jù),那么可能你的QPS到1000的時候,你的帶寬就打滿了,即使其他的指標正常,那么這也不能繼續(xù)壓測了。

內存負載

2.使用壓測工具對mysql進行全方位壓測(sysbench)

sysbench工具的安裝

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
sysbench --version

如果執(zhí)行完上面的命令之后,出現(xiàn)版本號,說明安裝成功。

測試數(shù)據(jù)庫的測試用例

首先創(chuàng)建一個數(shù)據(jù)庫,然后取名字為test_db,同時創(chuàng)建號對應的帳戶名和密碼,然后基于sysbench構建10個測試表,每個表里有100萬數(shù)據(jù),接著使用10個并發(fā)線程對這個數(shù)據(jù)庫發(fā)起訪問,連續(xù)訪問5分鐘。

基于sysbench構造測試表和測試數(shù)據(jù)

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_write --db-ps-mode=disable prepare

參數(shù)含義解釋:
--db-driver=mysql:就是說基于mysql的驅動去連接mysql數(shù)據(jù)庫,如果要是oracle、sqlserver,那就換成其他數(shù)據(jù)庫的驅動。
--time=300:連續(xù)訪問300秒
--threads=10:10個線程模擬并發(fā)訪問
--report-interval=1:每隔1秒輸出一下壓測情況
--mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword:
填寫數(shù)據(jù)庫的一些基本信息
--mysql-db=test_db --tables=10 --table_size=1000000:在test_db這個庫里,構造10張測試表,每個測試表里構造100萬條測試數(shù)據(jù),測試表的名字會是類似于sbtest1,sbtest2這個樣子的。
oltp_read_write:執(zhí)行oltp數(shù)據(jù)庫的讀寫測試
--db-ps-mode=disable: SQL是否需要預編譯,模式有:auto/disable,默認為disable。
prepare: 這個參數(shù)的意思是參照設置的命令參數(shù)去構造出我們需要的數(shù)據(jù)庫里的數(shù)據(jù),比如根據(jù)上面的參數(shù)它會自動創(chuàng)建設置出10張測試表和每個表里面創(chuàng)建100萬條測試數(shù)據(jù)。這個參數(shù)還有其他幾個選項比如:run:運行壓測;cleanup:清理數(shù)據(jù)。

測試數(shù)據(jù)庫的綜合讀寫TPS,使用的是oltp_read_write模式(看下面的命令把prepare換成run了,然后就是運行壓測):

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_write --db-ps-mode=disable run

測試數(shù)據(jù)庫的只讀性能,使用oltp_read_only模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_only --db-ps-mode=disable run

測試數(shù)據(jù)庫的刪除性能,使用的是oltp_delete模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_delete --db-ps-mode=disable run

測試數(shù)據(jù)庫更新索引字段的性能,使用的是oltp_update_index模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_update_index --db-ps-mode=disable run

測試數(shù)據(jù)庫更新非索引字段的性能,使用的是oltp_update_non_index模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_update_non_index --db-ps-mode=disable run

測試數(shù)據(jù)庫的插入性能,使用的是oltp_insert模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_insert --db-ps-mode=disable run

測試數(shù)據(jù)庫的寫入性能,使用的是oltp_write_only模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_write_only --db-ps-mode=disable run

清理壓測構造的數(shù)據(jù):

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql?
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_write  --db-ps-mode=disable cleanup

壓測結果分析

image.png

以紅色框住的測試信息為例,解析說明其含義:
thds:10 ,10個線程在壓測
tps:226.01 ,每秒可以執(zhí)行226.01個事務
qps:4499.11 ,每秒可以執(zhí)行4499.11個請求
(r/w/o: 3144.07/904.02/451.01) :,在每秒4499.11個請求中有3144.07個讀請求,904.02個寫請求,451.01個其他請求,其實就是對qps的拆解。
lat (ms,95%): 223.34 :,95%的請求延遲在223.34毫秒以下
err/s: 0.00 reconn/s: 0.00:,每秒有0個請求是失敗的,發(fā)生了0次網(wǎng)絡重連。

備注說明:其他請求是指類似commit等,除了select,insert,update,delete

最終的壓測報告

image.png

通過dstat命令來查看機器的性能指標

安裝dstat

yum -y install dstat

查看磁盤的吞吐量

dstat -d
image.png

上圖可以清晰的看到,IO吞吐量每秒讀取28B的數(shù)據(jù),每秒寫入41k的數(shù)據(jù),一般機械硬盤都可以做到每秒上baiMB的讀寫數(shù)據(jù)量。
查看磁盤的IOPS

dstat -r

image.png

上面的參數(shù)意思是讀IOPS和寫IOPS分別是多少,就是說隨機磁盤讀取每秒讀取多少次,和隨機磁盤寫入,每秒鐘執(zhí)行多少次,一般情況下,隨機磁盤讀寫每秒在兩三百次是可以接受的。
觀察網(wǎng)卡的流量情況

dstat -n
image.png

上圖顯示的就是每秒鐘通過網(wǎng)卡接收到的流量有多少kb,通過網(wǎng)卡發(fā)送出的流量有多少kb,如果你的機器是千兆網(wǎng)卡的話,那么每秒中網(wǎng)卡的總流量也就在100MB左右,甚至更低。

通過top命令來查看cpu,內存等性能指標

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容