全部產品
Search
文件中心

PolarDB:效能測試方法(OLTP)

更新時間:May 14, 2025

本文檔介紹以Sysbench工具測試PolarDB MySQL版叢集OLTP負載效能,您可以按照本文介紹自行測試對比,快速瞭解資料庫系統的效能。

測試載入器

Sysbench是一個開源的、跨平台的效能測試工具,主要用於資料庫基準測試(如MySQL)、 系統效能測試(如CPU、記憶體、IO、線程)。它支援多線程測試,並通過Lua指令碼靈活控制測試邏輯,適合資料庫效能評估、壓力測試等情境。

測試環境

  • 測試的ECS和PolarDB MySQL版需均在同一地區、同一可用性區域和同一個VPC網路。

    說明

    ECS執行個體和PolarDB MySQL版叢集需保證在同一個VPC中,確保ECS執行個體的PING延遲小於0.2ms,以保證效能評估的有效性。

  • 測試用PolarDB MySQL版叢集如下:

    • 唯讀、唯寫以及讀寫效能測試使用的是兩節點叢集(一主一隻讀)叢集進行測試。

    • 使用的串連地址涉及主地址、叢集地址以及自訂地址。實際測試過程中,會根據情況靈活調整串連串的組合方式,以確保最大化利用資料庫叢集資源。

  • 測試用ECS執行個體資訊如下:

    • 執行個體規格為ecs.c5.4xlarge(16核32 GB)。

    • 執行個體所使用的鏡像為CentOS 7.0 64位。

    • 執行個體數量,根據PolarDB叢集來定,計算節點為8核時,使用一個ECS執行個體,16核規格使用2個ECS執行個體,以此類推。

  • PolarDB MySQL版叢集參數配置:

    • 在進行高並發測試時,可能會出現can't create more than max_prepared_stmt_count statements的錯誤,從而導致測試失敗。可以通過增加max_prepared_stmt_count參數來允許更多的準備語句,參數設定請參見設定叢集參數和節點參數

    • 在大規模、高並發情境下,即便將max_prepared_stmt_count參數調整至最大值仍可能無法滿足需求。為確保效能測試的順利進行,測試命令將額外添加--db-ps-mode=disable參數,以禁用Prepared Statement功能。

    • 對於超大規格叢集(88 核及以上),還需引入額外的參數調優,以充分發揮叢集資源,具體調優參數將根據測試頁面執行個體規格和業務情境,建議您在實施最佳化前進行充分的效能評估,並根據實際效果進行參數微調。

注意事項

本次測試始終使用tables=250和table-size=25000的資料量,threads由低到高遞增進行測試,各效能測試詳情頁只展示峰值結果。

測試情境

對不同獨享規格的一主一隻讀節點叢集的唯讀、唯寫、讀寫效能進行OLTP效能測試。

衡量指標

  • TPS(Transactions Per Second):即資料庫每秒執行的事務數,以COMMIT成功次數為準。

  • QPS(Queries Per Second):即資料庫每秒執行的SQL數(含INSERT、SELECT、UPDATE、DELETE等)。

安裝Sysbench

重要

本文檔中的命令只能由root許可權的使用者來執行。

  1. 在ECS中執行如下命令安裝Sysbench。

    git clone https://github.com/akopytov/sysbench.git
    ##從Git中下載Sysbench
    
    cd sysbench
    ##開啟Sysbench目錄
    
    ./autogen.sh
    ##運行autogen.sh
    
    ./configure
    
    make -j
    ##編譯
    
    make install
  2. 執行如下命令配置Sysbench client,使核心可以利用所有的CPU核心數處理資料包(預設設定為2核),同時減少CPU核心數之間的環境切換。

    sudo sh -c 'for x in /sys/class/net/eth0/queues/rx-*; do echo ffff>$x/rps_cpus; done'
    說明

    ffff表示使用16個核。請根據實際配置修改,例如ECS為8核,則輸入ffffff為16核依次類推。

    sudo sh -c "echo 32768 > /proc/sys/net/core/rps_sock_flow_entries"
    sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt"
    sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt"

測試方法

說明

以下測試方法中以PolarDB MySQL版叢集版為例進行說明。

  1. 擷取PolarDB MySQL版叢集地址和連接埠。具體操作請參見管理串連地址

  2. PolarDB MySQL版叢集地址的主库是否接受读設定為,具體操作請參見設定資料庫代理

  3. 登入資料庫

    在ECS上執行如下命令,以在PolarDB MySQL版叢集中建立資料庫testdb為例。

    mysql -h XXX -P XXX -u XXX -p XXX -e 'create database testdb'
    說明

    請將本命令和後續步驟命令中的XXX替換為PolarDB MySQL版叢集的叢集地址、連接埠號碼、使用者名稱和密碼,具體參數說明如下。

    參數

    說明

    -h

    PolarDB MySQL版叢集的叢集地址。

    -P

    PolarDB MySQL版叢集的連接埠號碼。

    -u

    PolarDB MySQL版叢集的使用者名稱。

    -p

    上述使用者名稱對應的密碼。

  4. 具體情境測試命令如下:

    唯讀情境測試(OLTP Read Only)

    說明

    唯讀情境這裡--range-selects=0,相當於測試的oltp_point_selects情境。

    1. 準備資料

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only prepare
    2. 執行唯讀測試

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only run
    3. 清理資料

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only cleanup

    測試語句欄位含義如下:

    參數類別

    展示內容

    說明

    tables

    資料表數量

    所有參與測試的資料表數量。

    table_size

    資料錶行數

    展示每個表的記錄數量。

    資料量大小

    以儲存空間(如MB/GB)為單位展示表的資料量。

    threads

    並發線程數

    顯示當前配置的線程數量。

    線程狀態

    支援即時查看線程運行狀態。

    混合讀寫測試(OLTP Read Write)

    說明
    • 類比典型業務讀寫混合負載。

    • 具體的tables、table-size和threads等核心參數將在測試資料頁面中進行一對一的方式展示。

    1. 準備資料

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write prepare
    2. 執行讀寫測試

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write run
    3. 清理資料

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write cleanup

    測試語句欄位含義如下:

    參數類別

    展示內容

    說明

    tables

    資料表數量

    所有參與測試的資料表數量。

    table_size

    資料錶行數

    展示每個表的記錄數量。

    資料量大小

    以儲存空間(如MB/GB)為單位展示表的資料量。

    threads

    並發線程數

    顯示當前配置的線程數量。

    線程狀態

    支援即時查看線程運行狀態。

    寫入測試(OLTP Write Only)

    說明

    具體的tables、table-size和threads等核心參數將在測試資料頁面中進行一對一的方式展示。

    1. 準備資料

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only prepare
    2. 執行寫入測試

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only run
    3. 清理資料

      sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only cleanup

    測試語句欄位含義如下:

    參數類別

    展示內容

    說明

    tables

    資料表數量

    所有參與測試的資料表數量。

    table_size

    資料錶行數

    展示每個表的記錄數量。

    資料量大小

    以儲存空間(如MB/GB)為單位展示表的資料量。

    threads

    並發線程數

    顯示當前配置的線程數量。

    線程狀態

    支援即時查看線程運行狀態。

後續步驟