sysbench壓測MySQL數據庫

一般情況下,在企業中我們申請了一臺數據庫服務器,不是直接開發使用,而是先進行壓測,這樣就能心裏有數,這臺數據庫服務器的負載壓力如何,性能表現如何,每秒能抗住多少個請求。

1、測試機器

2 vCPU 4 GiB (I/O優化) ecs.t6-c1m2.large]

2、數據庫壓測工具

sysbench是非常好用的數據庫壓測工具,這個工具可以自動幫你在數據庫裏構造出來大量的數據,你想要多少數據,他就自動給你構造出來多少條數據。

然後這個工具接着可以模擬幾千個線程併發的訪問你的數據庫,模擬使用各種各樣的SQL語句來訪問你的數據庫,包括模擬出來各種事務提交到你的數據庫裏去,甚至可以模擬出幾十萬的TPS去壓測你的數據庫。

3、在Linux上安裝sysbench

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

4、建立測試庫

create database test_db 
character set utf8mb4 collate utf8mb4_bin;

5、準備測試表

sysbench 
//基於mysql的驅動去連接mysql數據庫
--db-driver=mysql 
//連續訪問300秒
--time=300 
//10個線程模擬併發訪問
--threads=10 
//每隔1秒輸出一下壓測情況
--report-interval=1 
//本機
--mysql-host=127.0.0.1 
//端口號:3306
--mysql-port=3306 
//測試用戶
--mysql-user=root 
//測試密碼
--mysql-password=******* 
//測試數據庫
--mysql-db=test_db 
//模擬新建20個表
--tables=20 
//100萬條數據 執行oltp數據庫的讀寫測試
--table_size=1000000 oltp_read_write 
//參照這個命令的設置去構造出來我們需要的數據庫裏的數據
//自動創建20個測試表,每個表裏創建100萬條測試數據
--db-ps-mode=disable prepare

執行結果:

Initializing worker threads...

Creating table 'sbtest2'...
Creating table 'sbtest3'...
Creating table 'sbtest7'...
Creating table 'sbtest5'...
Creating table 'sbtest9'...Creating table 'sbtest6'...

Creating table 'sbtest1'...
Creating table 'sbtest4'...
Creating table 'sbtest8'...
Creating table 'sbtest10'...
Inserting 1000000 records into 'sbtest1'
Inserting 1000000 records into 'sbtest8'
Inserting 1000000 records into 'sbtest3'
Inserting 1000000 records into 'sbtest6'
Inserting 1000000 records into 'sbtest5'
Inserting 1000000 records into 'sbtest9'
Inserting 1000000 records into 'sbtest2'
Inserting 1000000 records into 'sbtest7'
Inserting 1000000 records into 'sbtest10'
Inserting 1000000 records into 'sbtest4'
Creating a secondary index on 'sbtest8'...
Creating a secondary index on 'sbtest9'...
Creating a secondary index on 'sbtest7'...
Creating a secondary index on 'sbtest5'...
Creating a secondary index on 'sbtest4'...
Creating a secondary index on 'sbtest1'...
Creating a secondary index on 'sbtest6'...
Creating a secondary index on 'sbtest10'...
Creating a secondary index on 'sbtest2'...
Creating a secondary index on 'sbtest3'...
Creating table 'sbtest18'...
Inserting 1000000 records into 'sbtest18'
Creating table 'sbtest19'...
Inserting 1000000 records into 'sbtest19'
Creating table 'sbtest17'...
Inserting 1000000 records into 'sbtest17'
Creating table 'sbtest15'...
Inserting 1000000 records into 'sbtest15'
Creating table 'sbtest12'...
Creating table 'sbtest14'...
Inserting 1000000 records into 'sbtest12'
Inserting 1000000 records into 'sbtest14'
Creating table 'sbtest11'...
Inserting 1000000 records into 'sbtest11'
Creating table 'sbtest16'...
Creating table 'sbtest20'...
Inserting 1000000 records into 'sbtest16'
Inserting 1000000 records into 'sbtest20'
Creating table 'sbtest13'...
Inserting 1000000 records into 'sbtest13'
Creating a secondary index on 'sbtest18'...
Creating a secondary index on 'sbtest15'...
Creating a secondary index on 'sbtest17'...
Creating a secondary index on 'sbtest19'...
Creating a secondary index on 'sbtest11'...
Creating a secondary index on 'sbtest14'...
Creating a secondary index on 'sbtest12'...
Creating a secondary index on 'sbtest20'...
Creating a secondary index on 'sbtest13'...
Creating a secondary index on 'sbtest16'...

6、測試指標

[ 22s ] thds: 10 tps: 380.99 qps: 7312.66 (r/w/o: 5132.99/1155.86/1321.35) lat (ms, 95%): 21.33 err/s: 0.00 reconn/s: 0.00

這是第22s輸出的一段壓測統計報告,然後是其他的一些統計字段:

  1. thds: 10,這個意思就是有10個線程在壓測
  2. tps: 380.99,這個意思就是每秒執行了380.99個事務
  3. qps: 7610.20,這個意思就是每秒可以執行7610.20個請求
  4. (r/w/o: 5132.99/1155.86/1321.35),這個意思就是說,在每秒7610.20個請求中,有5132.99個請求是讀請求,1155.86個請求是寫請求,1321.35個請求是其他的請求,就是對QPS進行了拆解。
  5. lat (ms, 95%): 21.33,這個意思就是說,95%的請求的延遲都在21.33毫秒以下。
  6. err/s: 0.00 reconn/s: 0.00,這兩個的意思就是說,每秒有0個請求是失敗的,發生了0次網絡重連。

7、測試

7.1、測試數據庫的綜合讀寫TPS,使用oltp_read_write模式

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

測試數據:

[ 41s ] thds: 10 tps: 151.00 qps: 3029.96 (r/w/o: 2122.97/604.99/302.00) lat (ms,95%): 164.45 err/s: 0.00 reconn/s: 0.00

測試結果:

SQL statistics:
    queries performed:
        read:                            1224314  // 這就是說在300s的壓測期間執行了122萬多次的讀請求
        write:                           349804  // 這是說在壓測期間執行了34萬多次的寫請求
        other:                           174902  // 這是說在壓測期間執行了17萬多次的其他請求
        total:                           1749020   // 這是說一共執行了174萬多次的請求
    transactions:                        87451  (291.42 per sec.) // 這是說一共執行了8萬多個事務,每秒執行291多個事務
    queries:                             1749020 (5828.46 per sec.) // 這是說一共執行了174萬多次的請求,每秒執行5828請求
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)
// 下面就是說,一共執行了300s的壓測,執行了8萬+的事務
General statistics:
    total time:                          300.0811s 
    total number of events:              87451

Latency (ms):
         min:                                    2.17 // 請求中延遲最小的是2.17ms
         avg:                                   34.31 // 所有請求平均延遲是34.31ms
         max:                                 1392.50 // 延遲最大的請求是1392ms
         95th percentile:                      116.80 // 95%的請求延遲都在116.8ms以內
         sum:                              3000481.07

Threads fairness:
    events (avg/stddev):           8745.1000/44.26
    execution time (avg/stddev):   300.0481/0.01

7.2、測試數據庫的只讀性能,使用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=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_only --db-ps-mode=disable run

測試結果:

SQL statistics:
    queries performed:
        read:                            4938346
        write:                           0
        other:                           705478
        total:                           5643824
    transactions:                        352739 (1175.77 per sec.)
    queries:                             5643824 (18812.26 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0065s
    total number of events:              352739

Latency (ms):
         min:                                    1.25
         avg:                                    8.50
         max:                                  235.05
         95th percentile:                       10.27
         sum:                              2999388.48

Threads fairness:
    events (avg/stddev):           35273.9000/275.06
    execution time (avg/stddev):   299.9388/0.00

7.3、測試數據庫的刪除性能,使用oltp_delete模式

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

測試數據:

[ 299s ] thds: 10 tps: 5009.21 qps: 5009.21 (r/w/o: 0.00/1156.28/3852.93) lat (ms,95%): 2.71 err/s: 0.00 reconn/s: 0.00

測試結果:

SQL statistics:
    queries performed:
        read:                            0
        write:                           291058
        other:                           856277
        total:                           1147335
    transactions:                        1147335 (3824.38 per sec.)
    queries:                             1147335 (3824.38 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0038s
    total number of events:              1147335

Latency (ms):
         min:                                    0.03
         avg:                                    2.61
         max:                                 2114.86
         95th percentile:                        5.18
         sum:                              2999247.54
Threads fairness:
    events (avg/stddev):           114733.5000/470.77
    execution time (avg/stddev):   299.9248/0.00

7.4、測試數據庫的更新索引字段的性能,使用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=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_update_index --db-ps-mode=disable run

測試結果:

SQL statistics:
    queries performed:
        read:                            0
        write:                           246840
        other:                           840545
        total:                           1087385
    transactions:                        1087385 (3624.46 per sec.)
    queries:                             1087385 (3624.46 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0115s
    total number of events:              1087385

Latency (ms):
         min:                                    0.03
         avg:                                    2.76
         max:                                  999.91
         95th percentile:                        7.70
         sum:                              2999310.61

Threads fairness:
    events (avg/stddev):           108738.5000/827.44
    execution time (avg/stddev):   299.9311/0.00

7.5、測試數據庫的插入性能,使用oltp_insert模式

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

測試數據:

[ 20s ] thds: 10 tps: 526.99 qps: 3145.93 (r/w/o: 0.00/2029.96/1115.98) lat (ms,95%): 75.82 err/s: 0.00 reconn/s: 0.00

測試結果:

SQL statistics:
    queries performed:
        read:                            0
        write:                           837466
        other:                           0
        total:                           837466
    transactions:                        837466 (2791.42 per sec.)
    queries:                             837466 (2791.42 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0126s
    total number of events:              837466

Latency (ms):
         min:                                    0.54
         avg:                                    3.58
         max:                                  294.86
         95th percentile:                       11.65
         sum:                              2998915.52

Threads fairness:
    events (avg/stddev):           83746.6000/144.17
    execution time (avg/stddev):   299.8916/0.00

7.6、測試數據庫的寫入性能,使用的是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=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_write_only --db-ps-mode=disable run

測試數據:

[ 298s ] thds: 10 tps: 739.05 qps: 4424.33 (r/w/o: 0.00/2415.18/2009.15) lat (ms,95%): 70.55 err/s: 0.00 reconn/s: 0.00

測試結果:

SQL statistics:
    queries performed:
        read:                            0
        write:                           642227
        other:                           814255
        total:                           1456482
    transactions:                        242743 (808.75 per sec.)
    queries:                             1456482 (4852.59 per sec.)
    ignored errors:                      6      (0.02 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.1441s
    total number of events:              242743

Latency (ms):
         min:                                    0.74
         avg:                                   12.36
         max:                                  329.55
         95th percentile:                       68.05
         sum:                              3000839.57

Threads fairness:
    events (avg/stddev):           24274.3000/114.41
    execution time (avg/stddev):   300.0840/0.03

7.7、測試完成

使用上面的命令,sysbench工具會根據你的指令構造出各種各樣的SQL語句去更新或者查詢你的20張測試表裏的數據,同時監測出你的數據庫的壓測性能指標,最後完成壓測之後,可以執行下面的cleanup命令,清理數據。

  sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db --tables=20 --table_size=1000000 oltp_write_only --db-ps-mode=disable cleanup
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章