すべてのプロダクト
Search
ドキュメントセンター

Data Transmission Service:パフォーマンスホワイトペーパー

最終更新日:Mar 06, 2025

このトピックでは、Data Transmission Service (DTS) パフォーマンステストのテスト環境、テストツール、テスト方法、およびテスト結果について説明します。 例として、ApsaraDB RDS for MySQLインスタンス間の一方向データ同期タスクを使用します。

テスト環境

ソースデータベースとターゲットデータベースに関する情報

説明

テストで使用されるApsaraDB RDS for MySQLインスタンスでは、自動ストレージ拡張機能が有効になっています。

データベース

リージョン

タイプ

バージョン

仕様

CPU

メモリ

ソースデータベース

中国 (杭州)

RDS High-availability Editionを実行する標準のApsaraDB RDS for MySQLインスタンス

8.0

mysql.x4.xlarge.2c (専用)

8

32 GB

同期先データベース

クライアント

説明

クライアントとして使用するECSインスタンスのIPアドレスを、ApsaraDB RDS for MySQLインスタンスのIPアドレスホワイトリストに追加する必要があります。 詳細については、「IPアドレスホワイトリストの設定」をご参照ください。

タイプ

リージョン

ネットワークタイプ

OS

仕様

vCPU

メモリ

パブリックIPが割り当てられているかどうか

ECS インスタンス

中国 (杭州)

VPC

説明

ECSインスタンスのVPCおよびvSwitchは、ApsaraDB RDS for MySQLインスタンスのVPCおよびvSwitchと同じです。

CentOS 7.9 64ビット

ecs.c7.8xlarge (計算最適化タイプc7)

32

64

必須

テストツール

概要

ツール

バージョン

説明

SysBench

1.0.20

複数のスレッドを使用して、さまざまなプラットフォーム間で高負荷のデータベースシステムのパフォーマンスをテストできるモジュール式ベンチマークツール。 コアメトリックのデータは、データベースシステムのパフォーマンスをすばやく知るのに役立ちます。

BenchmarkSQL

5.0 (Java 8ベース)

データベースシステムのパフォーマンス評価とストレステストのために、オンライントランザクション処理 (OLTP) ワークロードをシミュレートできるオープンソースのデータベースパフォーマンステストツール。

ツールのインストール

Sysbenchのインストール

  1. Sysbenchをダウンロードし、ECSインスタンスにインストールします。

    # Install the dependency library of Sysbench.
    yum -y install make automake libtool pkgconfig libaio-devel
    yum -y install mariadb-devel openssl-devel
    
    # Download the source code of Sysbench.
    wget "https://codeload.github.com/akopytov/sysbench/zip/refs/tags/1.0.20" -O sysbench-1.0.20.zip
    
    # Install the Unzip utility.
    yum -y install unzip
    
    # Decompress the source code.
    unzip sysbench-1.0.20.zip
    
    # Compile the source code.
    cd sysbench-1.0.20
    ./autogen.sh
    ./configure
    sed -i 's/MYSQL_OPT_COMPRESSION_ALGORITHMS/MYSQL_OPT_COMPRESS/g' ./src/drivers/mysql/drv_mysql.c
    make -j
    
    # Install Sysbench.
    make install
  2. 大きなテーブルが使用されるシナリオ用のLuaスクリプト (dm_large_table_write_only.lua) 、ホットデータ更新シナリオ用のスクリプト (dm_hot_update_only.lua) 、およびDDL同期シナリオ用のスクリプト (dm_ddl_only.lua) を準備します。

    Luaスクリプト

    dm_large_table_write_only.lua

    #!/usr/bin/env sysbench
    -- Copyright (C) 2006-2017 Alexey Kopytov <akopytov@gmail.com>
    
    -- This program is free software; you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation; either version 2 of the License, or
    -- (at your option) any later version.
    
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    
    -- You should have received a copy of the GNU General Public License
    -- along with this program; if not, write to the Free Software
    -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    
    -- ----------------------------------------------------------------------
    -- Large table benchmark for data migration
    -- ----------------------------------------------------------------------
    require("oltp_common")
    
    local function get_table_num()
       return sysbench.rand.uniform(1, sysbench.opt.tables)
    end
    
    local function get_id()
       return sysbench.rand.default(1, sysbench.opt.table_size)
    end
    
    -- Generate large string template, size 1024 * 50
    local function get_large_templete()
       local large_temp = ""
       for i=1,1024 do
          large_temp = large_temp .. "#########-#########-#########-#########-#########-"
       end
       return large_temp
    end
    
    -- Generate large string template, size 1024 * 50
    local large_template = get_large_templete()
    
    -- Generate large value, size 1024 * 50
    local function get_large_value()
       return sysbench.rand.string(large_template)
    end
    
    function large_create_table(drv, con, table_num)
       if drv:name() == "mysql"
       then
          print(string.format("Creating mysql table 'sbtest%d'...", table_num))
       else
          error("Unsupported database driver:" .. drv:name())
       end
    
       query = string.format([[
    CREATE TABLE sbtest%d(
      id int not null auto_increment,
      k INTEGER DEFAULT '0' NOT NULL,
      c longtext,
      pad longtext,
      primary key (id)
    ) ]],table_num)
    
       con:query(query)
    
       if (sysbench.opt.table_size > 0) then
          print(string.format("Inserting %d records into 'sbtest%d'",
                              sysbench.opt.table_size, table_num))
       end
       query = "INSERT INTO sbtest" .. table_num .. "(k, c, pad) VALUES"
       con:bulk_insert_init(query)
    
       for i = 1, sysbench.opt.table_size do
    
          local large_value = get_large_value()
          query = string.format("(%d, '%s', '%s')",
                                   sysbench.rand.default(1, sysbench.opt.table_size),
                                   large_value, large_value)
          con:bulk_insert_next(query)
       end
    
       con:bulk_insert_done()
    
       if sysbench.opt.create_secondary then
          print(string.format("Creating a secondary index on 'sbtest%d'...",
                              table_num))
          con:query(string.format("CREATE INDEX k_%d ON sbtest%d(k)",
                                  table_num, table_num))
       end
    end
    
    
    function execute_delete_inserts_large()
       local tnum = get_table_num()
    
       for i = 1, sysbench.opt.delete_inserts do
          local id = get_id()
          local k = get_id()
    
          param[tnum].deletes[1]:set(id)
    
          param[tnum].inserts[1]:set(id)
          param[tnum].inserts[2]:set(k)
          param[tnum].inserts[3]:set_rand_str(large_template)
          param[tnum].inserts[4]:set_rand_str(large_template)
    
          stmt[tnum].deletes:execute()
          stmt[tnum].inserts:execute()
       end
    end
    
    function execute_non_index_updates_large()
       local tnum = get_table_num()
    
       for i = 1, sysbench.opt.non_index_updates do
          param[tnum].non_index_updates[1]:set_rand_str(large_template)
          param[tnum].non_index_updates[2]:set(get_id())
    
          stmt[tnum].non_index_updates:execute()
       end
    end
    
    local t = sysbench.sql.type
    local stmt_defs = {
       point_selects = {
          "SELECT c FROM sbtest%u WHERE id=?",
          t.INT},
       simple_ranges = {
          "SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ?",
          t.INT, t.INT},
       sum_ranges = {
          "SELECT SUM(k) FROM sbtest%u WHERE id BETWEEN ? AND ?",
           t.INT, t.INT},
       order_ranges = {
          "SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
           t.INT, t.INT},
       distinct_ranges = {
          "SELECT DISTINCT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
          t.INT, t.INT},
       index_updates = {
          "UPDATE sbtest%u SET k=k+1 WHERE id=?",
          t.INT},
       non_index_updates = {
          "UPDATE sbtest%u SET c=? WHERE id=?",
          {t.CHAR, 51200}, t.INT},
       deletes = {
          "DELETE FROM sbtest%u WHERE id=?",
          t.INT},
       inserts = {
          "INSERT INTO sbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)",
          t.INT, t.INT, {t.CHAR, 51200}, {t.CHAR, 51200}},
    }
    
    function prepare_for_each_large_table(key)
       for t = 1, sysbench.opt.tables do
          stmt[t][key] = con:prepare(string.format(stmt_defs[key][1], t))
    
          local nparam = #stmt_defs[key] - 1
    
          if nparam > 0 then
             param[t][key] = {}
          end
    
          for p = 1, nparam do
             local btype = stmt_defs[key][p+1]
             local len
    
             if type(btype) == "table" then
                len = btype[2]
                btype = btype[1]
             end
             if btype == sysbench.sql.type.VARCHAR or
                btype == sysbench.sql.type.CHAR then
                   param[t][key][p] = stmt[t][key]:bind_create(btype, len)
             else
                param[t][key][p] = stmt[t][key]:bind_create(btype)
             end
          end
    
          if nparam > 0 then
             stmt[t][key]:bind_param(unpack(param[t][key]))
          end
       end
    end
    
    -- Overwrite oltp_common create_table function  
    create_table = large_create_table
    
    -- Overwrite oltp_common prepare_for_each_table function  
    prepare_for_each_table = prepare_for_each_large_table
    
    -- Overwrite oltp_common execute_delete_inserts function  
    execute_delete_inserts = execute_delete_inserts_large
    
    -- Overwrite oltp_common execute_non_index_updates function  
    execute_non_index_updates = execute_non_index_updates_large
    
    function prepare_statements()
       if not sysbench.opt.skip_trx then
          prepare_begin()
          prepare_commit()
       end
    
       prepare_index_updates()
       prepare_non_index_updates()
       prepare_delete_inserts()
    end
    
    function event()
       if not sysbench.opt.skip_trx then
          begin()
       end
    
       execute_index_updates()
       execute_non_index_updates()
       execute_delete_inserts()
    
       if not sysbench.opt.skip_trx then
          commit()
       end
    end

    dm_hot_update_only.lua

    #!/usr/bin/env sysbench
    -- Copyright (C) 2006-2017 Alexey Kopytov <akopytov@gmail.com>
    
    -- This program is free software; you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation; either version 2 of the License, or
    -- (at your option) any later version.
    
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    
    -- You should have received a copy of the GNU General Public License
    -- along with this program; if not, write to the Free Software
    -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    
    -- ----------------------------------------------------------------------
    -- Hot update benchmark for data migration
    -- ----------------------------------------------------------------------
    require("oltp_common")
    
    function create_hot_update_table(drv, con, table_num)
       local query
       if table_num < 3
       then
          query = string.format([[
             CREATE TABLE IF NOT EXISTS sbtest%d(
               id int not null auto_increment,
               k INTEGER DEFAULT '0' NOT NULL,
               primary key (id)
             )]], table_num)
                con:query(query)
          query = string.format([[
             CREATE PROCEDURE generate_hot_update_sbtest%d (IN id_val int(11), IN update_count int(11) )
             BEGIN
               DECLARE i int default 1;
               INSERT IGNORE INTO sbtest%d (id,k) values(id_val,id_val); 
               WHILE i<=update_count DO
                   UPDATE sbtest%d SET k=k+1 where id=id_val; 
                   SET i = i + 1;
               END WHILE;
             END]], table_num, table_num, table_num)
                con:query(query)
       else
          print(string.format("Ignore create table sbtest%d",table_num))
       end
    end
    
    -- Overwrite oltp_common create_table function  
    create_table = create_hot_update_table
    
    function prepare_statements()
    end
    
    local function get_table_num()
       return sysbench.rand.uniform(1, 2)
    end
    
    local function get_id()
       return sysbench.rand.default(1, 10)
    end
    
    function event()
       local table_id
       local query
       local id_val
    
       id_val = get_id()
    
       table_id = get_table_num()
       query = string.format("CALL generate_hot_update_sbtest%d(%d,10)",table_id, id_val)
       con:query(query)
    end
    

    dm_ddl_only.lua

    #!/usr/bin/env sysbench
    -- Copyright (C) 2006-2017 Alexey Kopytov <akopytov@gmail.com>
    
    -- This program is free software; you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation; either version 2 of the License, or
    -- (at your option) any later version.
    
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    
    -- You should have received a copy of the GNU General Public License
    -- along with this program; if not, write to the Free Software
    -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    
    -- ----------------------------------------------------------------------
    -- DDL benchmark for data migration
    -- ----------------------------------------------------------------------
    require("oltp_common")
    
    function empty_create_table(drv, con, table_num)
       print(string.format("Ignore create table sbtest%d",table_num))
    end
    
    create_table = empty_create_table
    
    function prepare_statements()
    end
    
    local function get_table_num()
       return sysbench.rand.uniform(1, sysbench.opt.tables)
    end
    
    function event()
       local table_id
       local create_query
       local drop_query
    
       table_id = get_table_num()
       create_query = string.format([[
    CREATE TABLE IF NOT EXISTS sbtest%d(
      id int not null auto_increment,
      k INTEGER DEFAULT '0' NOT NULL,
      c CHAR(120) DEFAULT '' NOT NULL,
      pad CHAR(60) DEFAULT '' NOT NULL,
      primary key (id)
    )]],table_id)
       con:query(create_query)
    
       drop_query = string.format("DROP TABLE IF EXISTS sbtest%d",table_id)
       con:query(drop_query)
    end
    
  3. 3つのLuaスクリプトをECSインスタンスにアップロードし、Sysbenchスクリプトディレクトリ /usr/local/share/sysbench/ にコピーします。

    # Copy the script for the scenarios where large tables are used.
    cp dm_large_table_write_only.lua /usr/local/share/sysbench/
    # Copy the script for the hot data update scenario.
    cp dm_hot_update_only.lua /usr/local/share/sysbench/
    # Copy the script for the DDL synchronization scenario.
    cp dm_ddl_only.lua /usr/local/share/sysbench/

BenchmarkSQLのインストール

# Install Apache Ant.
yum -y install ant

# Download the source code of BenchmarkSQL.
wget "https://github.com/jackysp/benchmarksql/archive/refs/heads/5.0-mysql-support-opt-2.1.zip" -O benchmarksql-5.0-mysql-support-opt-2.1.zip

# Decompress the source code.
unzip benchmarksql-5.0-mysql-support-opt-2.1.zip

# Build the source code.
cd benchmarksql-5.0-mysql-support-opt-2.1
ant

テスト方法

概要

次の方法を使用して、さまざまなディメンションからデータ同期タスクのパフォーマンスをテストできます。

テストツール

テストモデルまたはスクリプト

テスト済みの機能

Sysbench

oltp_write_only

フルデータ同期と増分データ同期

dm_large_table_write_only

フルデータ同期と増分データ同期

dm_hot_update_only

増分データ同期

dm_ddl_only

増分データ同期

BenchmarkSQL

TPC-C

フルデータ同期と増分データ同期

手順

oltp_write_only

  1. 基本データを準備します。

    ECSインスタンスで、Sysbenchを使用してソースApsaraDB RDS for MySQLインスタンス用に10個のテーブルを作成し、各テーブルに1,000万個のデータエントリをインポートします。

    説明

    /usr/local/share/sysbench/ ディレクトリで次のコマンドを実行します。

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --table_size=10000000 --tables=10  oltp_write_only.lua \
    prepare

    パラメーター

    説明

    補足

    関連ドキュメント

    -- mysql-host

    ApsaraDB RDS for MySQLインスタンスの内部エンドポイントを指定します。

    {HOST} をApsaraDB RDS for MySQLインスタンスの内部エンドポイントに置き換えます。

    インスタンスのエンドポイントとポートの表示と管理

    -- mysqlポート

    ApsaraDB RDS for MySQLインスタンスの内部ポート番号を指定します。

    {PORT} をApsaraDB RDS for MySQLインスタンスの内部ポート番号に置き換えます。

    -- mysql-user

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのユーザー名。

    データベースアカウントに必要な権限があることを確認してください。

    アカウントの作成

    -- mysql-password

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのパスワード。

    -- mysql-db

    ストレステストが実行されるデータベースの名前。

    事前にデータベースを作成し、{database} をデータベースの名前に置き換えます。

    データベースの管理

    -- テーブル

    テーブルの数。

    この例では、このパラメーターは10に設定されています。

    非該当

    -- table_size

    各テーブルのデータエントリ数。

    この例では、このパラメーターは10000000に設定されています。

  2. DTSデータ同期タスクを作成します。

    同期タイプ パラメーターに スキーマ同期 および 完全データ同期 を選択します。 詳細については、「ApsaraDB RDS For MySQLインスタンス間の一方向データ同期の設定」をご参照ください。

  3. 完全なデータ同期が完了するまで待ちます。

  4. 増分データ同期のストレステストを実行します。

    ECSインスタンスでoltp_write_onlyモデルを使用して、データ同期タスクのソースデータベースでストレステストを実行し、バイナリログを生成します。

    説明

    異なるDML操作の割合: INSERT:UPDATE:DELETE = 1:2:1

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --table_size=1000000 --tables=10 --time=600 oltp_write_only.lua \
    run

    パラメーター

    説明

    補足

    -時間

    ストレステストの期間。 単位は秒です。

    この例では、このパラメーターは600に設定されています。

    -- threads

    ストレステスト用のスレッド数。

    この例では、このパラメーターは64に設定されています。

  5. DTSデータ同期タスクの パフォーマンスモニタリング ページで、タスクのパフォーマンスを表示します。

    詳細については、「タスクのパフォーマンスの監視」をご参照ください。

dm_large_table_write_only

  1. 基本データを準備します。

    ECSインスタンスで、Sysbenchを使用して、ソースApsaraDB RDS for MySQLインスタンス用に10個のテーブルを作成します。 各テーブルに10,000データエントリをインポートします。

    説明

    /usr/local/share/sysbench/ ディレクトリで次のコマンドを実行します。

    sysbench -- db-driver=mysql \
    -- mysql-host={HOST} \
    -- mysql-port={PORT} \
    -- mysql-user= \
    -- mysql-password= \
    -- mysql-db={データベース} \
    -- threads=64 -- table_size=10000 -- tables=10 dm_large_table_write_only.lua \
    準備する 

    パラメーター

    説明

    補足

    関連ドキュメント

    -- mysql-host

    ApsaraDB RDS for MySQLインスタンスの内部エンドポイントを指定します。

    {HOST} をApsaraDB RDS for MySQLインスタンスの内部エンドポイントに置き換えます。

    インスタンスのエンドポイントとポートの表示と管理

    -- mysqlポート

    ApsaraDB RDS for MySQLインスタンスの内部ポート番号を指定します。

    {PORT} をApsaraDB RDS for MySQLインスタンスの内部ポート番号に置き換えます。

    -- mysql-user

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのユーザー名。

    データベースアカウントに必要な権限があることを確認してください。

    アカウントの作成

    -- mysql-password

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのパスワード。

    -- mysql-db

    ストレステストが実行されるデータベースの名前。

    事前にデータベースを作成し、{database} をデータベースの名前に置き換えます。

    データベースの管理

    -- テーブル

    テーブルの数。

    この例では、このパラメーターは10に設定されています。

    非該当

    -- table_size

    各テーブルのデータエントリ数。

    この例では、このパラメーターは10000に設定されています。

  2. DTSデータ同期タスクを作成します。

    同期タイプ パラメーターに スキーマ同期 および 完全データ同期 を選択します。 詳細については、「ApsaraDB RDS For MySQLインスタンス間の一方向データ同期の設定」をご参照ください。

  3. 完全なデータ同期が完了するまで待ちます。

  4. 増分データ同期のストレステストを実行します。

    ECSインスタンスで、dm_large_table_write_onlyモデルを使用して、データ同期タスクのソースデータベースでストレステストを実行し、バイナリログを生成します。

    sysbench -- db-driver=mysql \
    -- mysql-host={HOST} \
    -- mysql-port={PORT} \
    -- mysql-user= \
    -- mysql-password= \
    -- mysql-db={データベース} \
    -- threads=64 -- table_size=10000 -- tables=10 -- time=600 dm_large_table_write_only.lua \
    実行 

    パラメーター

    説明

    補足

    -時間

    ストレステストの期間。 単位は秒です。

    この例では、このパラメーターは600に設定されています。

    -- threads

    ストレステスト用のスレッド数。

    この例では、このパラメーターは64に設定されています。

  5. DTSデータ同期タスクの パフォーマンスモニタリング ページで、タスクのパフォーマンスを表示します。

    詳細については、「タスクのパフォーマンスの監視」をご参照ください。

dm_hot_update_only

  1. DTSデータ同期タスクを作成します。

    同期タイプ パラメーターに 完全データ同期 を選択しないでください。 対応するデータベースとテーブルが移行先ApsaraDB RDS for MySQLインスタンスに作成されていない場合は、スキーマ同期 を選択する必要があります。 詳細については、「ApsaraDB RDS For MySQLインスタンス間の一方向データ同期の設定」をご参照ください。

  2. ストレステストを実行するテーブルのデータを初期化します。

    sysbench -- db-driver=mysql \
    -- mysql-host={HOST} \
    -- mysql-port={PORT} \
    -- mysql-user= \
    -- mysql-password= \
    -- mysql-db={データベース} \
    -- threads=64 -- tables=2 dm_hot_update_only.lua \
    準備する 

    パラメーター

    説明

    補足

    関連ドキュメント

    -- mysql-host

    ApsaraDB RDS for MySQLインスタンスの内部エンドポイントを指定します。

    {HOST} をApsaraDB RDS for MySQLインスタンスの内部エンドポイントに置き換えます。

    インスタンスのエンドポイントとポートの表示と管理

    -- mysqlポート

    ApsaraDB RDS for MySQLインスタンスの内部ポート番号を指定します。

    {PORT} をApsaraDB RDS for MySQLインスタンスの内部ポート番号に置き換えます。

    -- mysql-user

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのユーザー名。

    データベースアカウントに必要な権限があることを確認してください。

    アカウントの作成

    -- mysql-password

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのパスワード。

    -- mysql-db

    ストレステストが実行されるデータベースの名前。

    事前にデータベースを作成し、{database} をデータベースの名前に置き換えます。

    データベースの管理

    -- テーブル

    テーブルの数。

    この例では、このパラメーターは2に設定されています。

    非該当

  3. 増分データ同期のストレステストを実行します。

    ECSインスタンスで、dm_hot_update_onlyモデルを使用して、データ同期タスクのソースデータベースでストレステストを実行し、バイナリログを生成します。

    sysbench -- db-driver=mysql \
    -- mysql-host={HOST} \
    -- mysql-port={PORT} \
    -- mysql-user= \
    -- mysql-password= \
    -- mysql-db={データベース} \
    -- threads=64 -- tables=2 -- time=600 dm_hot_update_only.lua \
    実行 

    パラメーター

    説明

    補足

    -時間

    ストレステストの期間。 単位は秒です。

    この例では、このパラメーターは600に設定されています。

    -- threads

    ストレステスト用のスレッド数。

    この例では、このパラメーターは64に設定されています。

  4. DTSデータ同期タスクの パフォーマンスモニタリング ページで、タスクのパフォーマンスを表示します。

    詳細については、「タスクのパフォーマンスの監視」をご参照ください。

dm_ddl_only

  1. DTSデータ同期タスクを作成します。

    同期タイプ パラメーターに 完全データ同期 を選択しないでください。 対応するデータベースとテーブルが移行先ApsaraDB RDS for MySQLインスタンスに作成されていない場合は、スキーマ同期 を選択する必要があります。 詳細については、「ApsaraDB RDS For MySQLインスタンス間の一方向データ同期の設定」をご参照ください。

  2. 増分データ同期のストレステストを実行します。

    ECSインスタンスで、dm_ddl_onlyモデルを使用して、データ同期タスクのソースデータベースでストレステストを実行し、バイナリログを生成します。

    sysbench -- db-driver=mysql \
    -- mysql-host={HOST} \
    -- mysql-port={PORT} \
    -- mysql-user= \
    -- mysql-password= \
    -- mysql-db={データベース} \
    -- threads=64 -- tables=2 -- time=600 dm_ddl_only.lua \
    実行 

    パラメーター

    説明

    補足

    関連ドキュメント

    -- mysql-host

    ApsaraDB RDS for MySQLインスタンスの内部エンドポイントを指定します。

    {HOST} をApsaraDB RDS for MySQLインスタンスの内部エンドポイントに置き換えます。

    インスタンスのエンドポイントとポートの表示と管理

    -- mysqlポート

    ApsaraDB RDS for MySQLインスタンスの内部ポート番号を指定します。

    {PORT} をApsaraDB RDS for MySQLインスタンスの内部ポート番号に置き換えます。

    -- mysql-user

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのユーザー名。

    データベースアカウントに必要な権限があることを確認してください。

    アカウントの作成

    -- mysql-password

    ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのパスワード。

    -- mysql-db

    ストレステストが実行されるデータベースの名前。

    事前にデータベースを作成し、{database} をデータベースの名前に置き換えます。

    データベースの管理

    -- threads

    ストレステスト用のスレッド数。

    この例では、このパラメーターは64に設定されています。

    非該当

    -- テーブル

    テーブルの数。

    この例では、このパラメーターは2に設定されています。

    -時間

    ストレステストの期間。 単位は秒です。

    この例では、このパラメーターは600に設定されています。 これは、DDL操作が600秒間実行されることを意味する。

  3. DTSデータ同期タスクの パフォーマンスモニタリング ページで、タスクのパフォーマンスを表示します。

    詳細については、「タスクのパフォーマンスの監視」をご参照ください。

TPC-C

  1. 基本データを準備します。

    1. ECSインスタンスのBenchmarkSQLの作業ディレクトリに移動します。

      cd benchmarksql-5.0-mysql-support-opt-2.1/run/
    2. 設定ファイルprops.mysqlでソースインスタンスの接続情報を指定します。

      vim props.mysql

      次のコードブロックは、構成ファイルのサンプルを示しています。 {HOST}{PORT}{USER}{PASSWORD} 、および {DATABASE} を、ソースのApsaraDB RDS for MySQLインスタンスに関する対応する情報に置き換えます。

      db=mysql
      driver=com.mysql.jdbc.Driver
      conn=jdbc:mysql://{HOST }:{ PORT}/{DATABASE}?readOnlyPropagatesToServer=false&rewriteBatchedStatements=true&failOverReadOnly=false&connectTimeout=3000&allowMultiQueries=true&clobberStreamtrue Results 0
      user={USER}
      password={パスワード}
      
      倉庫=1000
      loadWorkers=100
      
      terminals=128
      // 指定されたトランザクションを端末ごとに実行するには-runMinsはゼロに等しくなければなりません
      runTxnsPerTerminal=0
      // 指定された分実行するには-runTxnsPerTerminalはゼロに等しくなければなりません
      runMins=10
      // 1分あたりの総トランザクション数
      limitTxnsPerMin=0
      
      // 4.x互換モードで実行するにはtrueに設定します。 を使用するにはfalseに設定します。// 構成されたデータベース全体。
      terminalWarehouseFixed=true
      
      // 次の5つの値を合計して100
      // 45、43、4、4、4のデフォルトの割合はTPC-Cの仕様と一致します
      newOrderWeight=45
      paymentWeight=43
      orderStatusWeight=4
      deliveryWeight=4
      stockLevelWeight=4
      
      // 詳細な結果データを収集するために作成するディレクトリ名。
      // これを抑制するためにコメントしてください。
      resultDirectory=my_result_% tY-% tm-% td_% tH % tM % tS
      
      // osCollectorScript=./misc/os_collector_linux.py
      // osCollectorInterval=1
      // osCollectorSSHAddr=user @ dbhost
      // osCollectorDevices=net_eth0 blk_sda 

      パラメーター

      説明

      補足

      conn

      インスタンスの接続設定。 {HOST} と {PORT} を次の情報に置き換えます。

      • HOST: ApsaraDB RDS for MySQLインスタンスの内部エンドポイント。

      • PORT: ApsaraDB RDS for MySQLインスタンスの内部ポート番号。

      • DATABASE: ApsaraDB RDS for MySQLインスタンスでテスト用に作成されたデータベースの名前。

      {HOST}{PORT} 、および {DATABASE} を対応する情報に置き換えます。

      user

      ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのユーザー名。

      {USER} を対応する情報に置き換えます。

      password

      ApsaraDB RDS for MySQLインスタンスで作成されたデータベースアカウントのパスワード。

      {PASSWORD} を対応する情報に置き換えます。

      runMins

      ストレステストの期間。 単位は分です。

      この例では、このパラメーターは10に設定されています。

    3. TPC-Cテストの基本データを初期化します。

      . /runDatabaseBuild.sh props.mysql

      10個のテーブルを作成します。 合計で約500万件のデータエントリをテーブルにインポートします。

  2. DTSデータ同期タスクを作成します。

    同期タイプ パラメーターに スキーマ同期 および 完全データ同期 を選択します。 詳細については、「ApsaraDB RDS For MySQLインスタンス間の一方向データ同期の設定」をご参照ください。

  3. 完全なデータ同期が完了するまで待ちます。

  4. 増分データ同期のストレステストを実行します。

    ECSインスタンスで、TPC-Cモデルを使用して、データ同期タスクのソースデータベースでストレステストを実行し、バイナリログを生成します。

    . /runBenchmark.sh props.mysql

    パラメーター

    説明

    補足

    -時間

    ストレステストの期間。 単位は秒です。

    この例では、このパラメーターは600に設定されています。

    -- threads

    ストレステスト用のスレッド数。

    この例では、このパラメーターは64に設定されています。

  5. DTSデータ同期タスクの パフォーマンスモニタリング ページで、タスクのパフォーマンスを表示します。

    詳細については、「タスクのパフォーマンスの監視」をご参照ください。

テスト結果

説明

増分データ同期タスクの最大パフォーマンスの詳細については、 データ同期パフォーマンスデータ。 タスクのパフォーマンスは、同期された行数 /秒 (RPS) で測定されます。

oltp_write_only

完全なデータ同期

インスタンスタイプ

RPS (行 /秒)

BPS (MB/s)

期間

マイクロ

17.95W

34.19

557

small

18.18W

34.63

550

medium

19.64W

37.42

509

大きい

19.96W

38.02

501

増分データ同期

インスタンスタイプ

RPS (行 /秒)

BPS (KB/s)

最大パフォーマンスに達したかどうか

マイクロ

200

86

必須

small

2000

982

必須

medium

5000

2605

必須

大きい

11000

5489

必須

dm_large_table_write_only

完全なデータ同期

インスタンスタイプ

RPS (行 /秒)

BPS (MB/s)

期間

マイクロ

469.48

35.09MB

213

small

480.77

35.94MB

208

medium

552.49

41.30MB

181

大きい

584.80

43.71

171

増分データ同期

インスタンスタイプ

RPS (行 /秒)

BPS (KB/s)

最大パフォーマンスに達したかどうか

マイクロ

200

9086.3

必須

small

683

31741.51

選択可能

medium

1033

56676.41

選択可能

大きい

1537

84344.32

選択可能

dm_hot_update_only

説明

デフォルトでは、trans.hot.merge.enableパラメーターはfalseに設定されています。 このパラメーターを変更する方法の詳細については、「DTSインスタンスのパラメーターの変更」をご参照ください。

trans.hot.merge.enableパラメーターはfalseに設定されています。

増分データ同期

インスタンスタイプ

RPS (行 /秒)

最大パフォーマンスに達したかどうか

マイクロ

200

必須

small

1,200

選択可能

medium

1,200

選択可能

大きい

1,200

選択可能

trans.hot.merge.enableパラメーターはtrueに設定されています。

増分データ同期

インスタンスタイプ

RPS (行 /秒)

最大パフォーマンスに達したかどうか

マイクロ

200

必須

small

2000

必須

medium

5000

必須

大きい

11000

必須

dm_ddl_only

増分データ同期

インスタンスタイプ

RPS (行 /秒)

最大パフォーマンスに達したかどうか

マイクロ

68

選択可能

small

68

選択可能

medium

68

選択可能

大きい

68

選択可能

TPC-C

完全なデータ同期

インスタンスタイプ

RPS (行 /秒)

BPS (MB/s)

期間

マイクロ

12.04W

17.52

4143

small

12.09W

17.59

4127

medium

12.73W

18.52

3921

大きい

13.50W

19.64

3696

増分データ同期

インスタンスタイプ

RPS (row/s)

BPS (KB/s)

最大パフォーマンスに達したかどうか

マイクロ

200

138

必須

small

2000

1920

必須

medium

5000

3847

必須

大きい

11000

7542

必須