Amazon Web Services ブログ

Amazon RDS for SQL Server の CPU 最適化機能の探索

Amazon Relational Database Service (Amazon RDS) for SQL Server が、CPU 最適化機能をサポートするようになりました。CPU 最適化機能を使用すると、新しいインスタンスを起動する際や既存のデータベースインスタンスを変更する際に、コア数を定義することができます。この機能は第 7 世代インスタンスクラスから利用可能です。以下のメリットがあります:

  • RDS SQL Server インスタンスの vCPU 数をカスタマイズ
  • 特定のワークロードに対して望ましいメモリ対 CPU 比を実現
  • ライセンスコストを削減し、全体的なコスト管理においてさらなる柔軟性を獲得する可能性

この投稿では、Amazon RDS for SQL Server で CPU 最適化機能を使用する方法について説明します。内容は以下の通りです:

  1. CPU 最適化を設定して新しいインスタンスを作成する
  2. CPU 最適化で既存のインスタンスを変更する
  3. CPU 最適化で設定されたスナップショットから復元する
  4. CPU 最適化でポイントインタイムリカバリ (PITR) を実行する

前提条件

この投稿の例では、AWS Command Line Interface (AWS CLI) を使用します。RDS for SQL Server DB インスタンスの作成に関する基本的な知識があり、CPU アーキテクチャの概念 (コア、コアあたりのスレッド数、vCPU) を理解している必要があります。

また、CPU 最適化機能が Amazon RDS for SQL Server の料金と DB インスタンスのパフォーマンスの両方にどのような影響を与えるかについても理解しておく必要があります。

CPU 最適化された新しいインスタンスの作成

CPU 最適化機能を使用して RDS SQL Server インスタンスを作成するには、create-db-instance コマンドで --processor-features パラメータを使用します。coreCountthreadsPerCore の値を指定してください。次のコマンドは、8 コアで 1 コアあたり 1 スレッドのインスタンスを作成し、合計 8 個の vCPU になります。

aws rds create-db-instance --region us-west-2 \
--engine-version 16.00 \
--allocated-storage 100 \
--license-model license-included \
--master-username admin --master-user-password XXXXX \
--no-multi-az \
--publicly-accessible \
--vpc-security-group-ids sg-XXXXX \
--db-subnet-group-name rds-db-sub-net-group-xxx \
--db-instance-identifier rfs-test-ocpu-instance \
--db-instance-class db.r7i.8xlarge \
--engine sqlserver-ee \
--processor-features "Name=coreCount,Value=8" "Name=threadsPerCore,Value=1"
Bash

このコマンドを使用する場合:

  • --processor-features パラメータには、coreCountthreadsPerCore の両方を指定することが必須です。
    • coreCount : インスタンスの CPU コア数をカスタマイズできます。選択したインスタンスタイプでコア数に許可されている値を確認するには、CPU 最適化をサポートする DB インスタンスクラスを参照してください。
    • hreadsPerCore : コアあたりのスレッド数は、CPU コアあたりのスレッド数を定義するように設定されます。第 7 世代インスタンスクラスタイプ以降、CPU 最適化機能がサポートされており、第 7 世代インスタンスではハイパースレッディングが無効になっているため、コアあたりのスレッド数の許可値は 1 です。
  • --processor-features パラメータは、Amazon RDS for SQL Server に最低 4 vCPU が必要です。

これらの設定を確認するには、describe-db-instances コマンドを使用してください:

----------------------------------------------------------------------------------
|                               DescribeDBInstances                              |
+-----------------+--------------------------+---------------+-------------------+
| DBInstanceClass |  DBInstanceIdentifier    |    Engine     |   EngineVersion   |
+-----------------+--------------------------+---------------+-------------------+
|  db.r7i.8xlarge |  rfs-test-ocpu-instance  |  sqlserver-ee |  16.00.4215.2.v1  |
+-----------------+--------------------------+---------------+-------------------+
||                               ProcessorFeatures                              ||
|+---------------------------------------------------+--------------------------+|
||                       Name                        |          Value           ||
|+---------------------------------------------------+--------------------------+|
||  coreCount                                        |  8                       ||
||  threadsPerCore                                   |  1                       ||
|+---------------------------------------------------+--------------------------+|
Bash

以下は、AWS Management Console での CPU 最適化機能の設定画面です。



注意 : ワークロードや RDS で自動化されたタスクに対してリソース制約を引き起こすことなく、設定された vCPU がワークロードを処理できるように、CPU 最適化機能を使用してワークロードのベンチマークを実行することをお勧めします。

CPU 最適化機能が有効になっている既存インスタンスの変更

–use-default-processor-features を使用したインスタンスの変更

CPU 最適化インスタンスをデフォルト設定に戻すには、--use-default-processor-features パラメータを使用します。

例えば、以下のコマンドは、db.r7i.8xlarge インスタンスタイプで 8 コア、1 スレッドのプロセッサ機能で設定されたインスタンス (rfs-test-ocpu-instance) を、そのデフォルト設定に変更します。

aws rds modify-db-instance --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance \
--use-default-processor-features \
--apply-immediately
Bash

前の例では、8 コアで 1 コアあたり 1 スレッドの CPU 最適化設定で構成された既存の db.r7i.8xlarge インスタンスを、16 コアで 1 コアあたり 1 スレッドの db.r7i.8xlarge インスタンスタイプのデフォルト設定を使用するように変換されます。

マルチ AZ インスタンスの場合、プライマリインスタンスとセカンダリインスタンスの両方が、プロセッサ機能設定に従って同一の vCPU 構成を持ちます。

注意 : DB インスタンスを変更して CPU 最適化を設定する場合、インスタンスクラスタイプを変更する際と同じように短時間の DB インスタンスのダウンタイムが発生します

–processor-features を使用したインスタンスの変更

既存のインスタンスを変更して、プロセッサ機能設定を指定することができます。例えば、以下のコマンドは、db.r7i.8xlarge インスタンスタイプとデフォルト設定で構成されている既存のインスタンス (rfs-test-ocpu-instance) を、CPU 最適化のカスタム設定に変更します。

aws rds modify-db-instance --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance \
--db-instance-class db.r7i.16xlarge \
--processor-features "Name=coreCount,Value=8" "Name=threadsPerCore,Value=1" \
--apply-immediately
Bash

デフォルトでは、db.r7i.16xlarge インスタンスは 32 コアでコアあたり 1 スレッドをサポートし、合計 32 個の vCPU となります。指定された設定で CPU 最適化機能を利用すると、インスタンスは 8 コアでコアあたり 1 スレッドに変更され、合計 8 個の vCPU となります。

CPU 最適化が設定されたスナップショットからの復元

CPU 最適化が有効になっているインスタンスのスナップショットから復元する場合、デフォルトでは設定はターゲットインスタンスにコピーされます。復元プロセス中に異なる CPU 最適化設定を指定することもできます。

CPU 最適化機能を使用したスナップショットの復元

この例では、CPU 最適化設定で構成された既存のインスタンス (rfs-test-ocpu-instance) のスナップショットバックアップを使用しています。これは db.r7i.16xlarge インスタンスタイプを使用し、8 コアでコアあたり 1 スレッドの CPU 最適化設定により、合計 8 個の vCPU を実現しています。

スナップショットを作成するには、以下のコマンドを実行してください :

aws rds create-db-snapshot --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance \
--db-snapshot-identifier backup-rfs-test-ocpu-instance
Bash

DB スナップショットの詳細を確認するには、次のコマンドを実行してください:

aws rds describe-db-snapshots --region us-west-2 \
--db-snapshot-identifier backup-rfs-test-ocpu-instance  \
--query "DBSnapshots[*].{DBInstanceIdentifier:DBInstanceIdentifier,DBSnapshotIdentifier:DBSnapshotIdentifier,Engine:Engine,EngineVersion:EngineVersion,ProcessorFeatures:ProcessorFeatures}"
Bash

次のようなアウトプットを取得できます :

------------------------------------------------------------------------------------------------
|                                      DescribeDBSnapshots                                     |
+-------------------------+---------------------------------+---------------+------------------+
|  DBInstanceIdentifier   |      DBSnapshotIdentifier       |    Engine     |  EngineVersion   |
+-------------------------+---------------------------------+---------------+------------------+
|  rfs-test-ocpu-instance |  backup-rfs-test-ocpu-instance  |  sqlserver-ee |  16.00.4215.2.v1 |
+-------------------------+---------------------------------+---------------+------------------+
||                                      ProcessorFeatures                                     ||
|+-------------------------------------------------------------+------------------------------+|
||                            Name                             |            Value             ||
|+-------------------------------------------------------------+------------------------------+|
||  coreCount                                                  |  8                           ||
||  threadsPerCore                                             |  1                           ||
|+-------------------------------------------------------------+------------------------------+|
Bash

スナップショットから復元するには、次のコマンドを実行してください:

aws rds restore-db-instance-from-db-snapshot --region us-west-2 \
--vpc-security-group-ids sg-XXXXX \
--db-subnet-group-name rds-db-sub-net-group-xxx \
--publicly-accessible \
--db-snapshot-identifier backup-rfs-test-ocpu-instance \
--db-instance-identifier rfs-test-ocpu-instance-3
Bash

restore-db-instance-from-db-snapshot では、インスタンスタイプや CPU 最適化設定を指定しなかったため、Amazon RDS はスナップショットから同じインスタンスタイプ (db.r7i.16xlarge) と CPU 最適化設定 (8 コア、コアあたり 1 スレッド) でインスタンスを作成します。

スナップショット復元で CPU 最適化機能を使用するシナリオは複数あります。

スナップショットを異なるインスタンスタイプとデフォルトのプロセッサ機能に復元

CPU 最適化が有効になっているインスタンスで取得したスナップショットは、異なるインスタンスタイプと --use-default-processor-features を指定することで復元できます。

この例では、CPU 最適化設定で構成された既存のインスタンス (rfs-test-ocpu-instance) のスナップショットバックアップを使用しています。元のインスタンスは db.r7i.16xlarge インスタンスタイプを使用し、8 コアでコアあたり 1 スレッドの CPU 最適化設定により、合計 8 個の vCPU となっています。

以下のコマンドは、スナップショットを異なるインスタンスタイプ (db.r7i.8xlarge) にデフォルトの CPU 設定 (16 コア、コアあたり 1 スレッド) で復元します。

aws rds restore-db-instance-from-db-snapshot --region us-west-2 \
--vpc-security-group-ids sg-XXXXX \
--db-subnet-group-name rds-db-sub-net-group-xxx \
--publicly-accessible \
--db-snapshot-identifier backup-rfs-test-ocpu-instance \
--db-instance-identifier rfs-test-ocpu-instance-5 \
--db-instance-class db.r7i.8xlarge \
--use-default-processor-features
Bash

(無効) 異なるインスタンスタイプで、プロセッサ機能が設定されていない設定でのスナップショットの復元

CPU 最適化の設定をしたインスタンスから異なるインスタンスタイプにスナップショットを復元する際は、プロセッサ機能設定を省略することはできません。以下の例では、これを試行した場合に何が起こるかを示しています。

このシナリオでは、db.r7i.16xlarge、8 コア、コアあたり 1 スレッドで構成されたインスタンス (rds-test-ocpu-instance) から取得したスナップショットを、プロセッサ機能を指定せずに異なるインスタンスタイプ (db.r7i.8xlarge) に復元しています :

aws rds restore-db-instance-from-db-snapshot --region us-west-2 \
--vpc-security-group-ids sg-XXXXX \
--db-subnet-group-name rds-db-sub-net-group-xxx \
--publicly-accessible \
--db-snapshot-identifier backup-rfs-test-ocpu-instance \
--db-instance-identifier rfs-test-ocpu-instance-6 \
--db-instance-class db.r7i.8xlarge
Bash

このコマンドは次のエラーで失敗します:

An error occurred (InvalidParameterCombination) when calling the RestoreDBInstanceFromDBSnapshot operation: 
Your request must specify ProcessorFeatures settings or set UseDefaultProcessorFeatures since the snapshot has ProcessorFeatures set.
Bash

スナップショットでプロセッサ機能が有効になっており、復元時に異なるインスタンスタイプを指定する場合は、ProcessorFeatures 設定または UseDefaultProcessorFeatures オプションのいずれかを明示的に指定する必要があります。

カスタムプロセッサ機能を持つ異なるインスタンスタイプにスナップショットを復元する

例えば、以下のコマンドは、db.r7i.16xlarge インスタンスタイプを使用して CPU 最適化設定 (8 コア、コアあたり 1 スレッド) で構成されたインスタンス (rfs-test-ocpu-instance) のスナップショットを復元します。新しいインスタンスタイプ (db.r7i.12xlarge) と新しい CPU 最適化設定 (18 コア、コアあたり 1 スレッド) を指定しました。

aws rds restore-db-instance-from-db-snapshot --region us-west-2 \
--vpc-security-group-ids sg-XXXXX \
--db-subnet-group-name rds-db-sub-net-group-xxx \
--publicly-accessible \
--db-snapshot-identifier backup-rfs-test-ocpu-instance \
--db-instance-identifier rfs-test-ocpu-instance-7 \
--db-instance-class db.r7i.12xlarge \
--processor-features "Name=coreCount,Value=18" "Name=threadsPerCore,Value=1"
Bash

CPU 最適化されたポイントインタイムリカバリ (PITR)

ポイントインタイムリカバリ (PITR) を使用すると、インスタンスを特定の時点に復元できます。このプロセスでは、PITR で指定された時刻に基づいて特定のスナップショットを復元し、その後そのスナップショットにすべてのトランザクションログバックアップを適用することで、インスタンスを指定された時点の状態にします。

PITR では、coreCountthreadsPerCore のプロセッサ機能設定は、PITR リクエスト時にカスタム値が指定されない限り、(その時点に設定されていた値ではなく) ソーススナップショットから取得されます。使用されているソーススナップショットで CPU 最適化が有効になっており、PITR で異なるインスタンスタイプを使用している場合は、ターゲットインスタンスの CPU 最適化オプションを定義するか、--use-default-processor-features オプションを指定する必要があります。上記のスナップショット復元で説明されたユースケースは、PITR にも適用されます。

TimeStamp-1 : CPU 最適化されたソースデータベースインスタンスの詳細

例えば、8 コアで 1 コアあたり 1 スレッドの CPU 最適化設定で db.r7i.8xlarge インスタンスタイプで実行されるインスタンス (rfs-test-ocpu-instance-8) があります。以下のコマンドはインスタンス設定を表示します。

aws rds describe-db-instances --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance-8 \
--query 'DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier,Engine:Engine,EngineVersion:EngineVersion,ProcessorFeatures:ProcessorFeatures,DBInstanceClass:DBInstanceClass}'
Bash

次のような出力が得られます :

------------------------------------------------------------------------------------
|                                DescribeDBInstances                               |
+-----------------+----------------------------+---------------+-------------------+
| DBInstanceClass |   DBInstanceIdentifier     |    Engine     |   EngineVersion   |
+-----------------+----------------------------+---------------+-------------------+
|  db.r7i.8xlarge |  rfs-test-ocpu-instance-8  |  sqlserver-ee |  16.00.4215.2.v1  |
+-----------------+----------------------------+---------------+-------------------+
||                                ProcessorFeatures                               ||
|+-----------------------------------------------------+--------------------------+|
||                        Name                         |          Value           ||
|+-----------------------------------------------------+--------------------------+|
||  coreCount                                          |  8                       ||
||  threadsPerCore                                     |  1                       ||
|+-----------------------------------------------------+--------------------------+|
Bash

TimeStamp-2: データベーススナップショットの作成

データベースのスナップショットを作成するために、以下のコマンドを実行します。

aws rds create-db-snapshot --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance-8 \
--db-snapshot-identifier pitr-backup-rfs-test-ocpu-instance-8
Bash

データベーススナップショットの詳細を確認するために以下のコマンドを使用します:

aws rds describe-db-snapshots --region us-west-2 \
--db-snapshot-identifier pitr-backup-rfs-test-ocpu-instance-8 \
--query "DBSnapshots[*].{DBInstanceIdentifier:DBInstanceIdentifier,DBSnapshotIdentifier:DBSnapshotIdentifier,Engine:Engine,EngineVersion:EngineVersion,ProcessorFeatures:ProcessorFeatures}"
Bash

次のような出力が得られます :

---------------------------------------------------------------------------------------------------------
|                                          DescribeDBSnapshots                                          |
+---------------------------+----------------------------------------+---------------+------------------+
|   DBInstanceIdentifier    |         DBSnapshotIdentifier           |    Engine     |  EngineVersion   |
+---------------------------+----------------------------------------+---------------+------------------+
|  rfs-test-ocpu-instance-8 |  pitr-backup-rfs-test-ocpu-instance-8  |  sqlserver-ee |  16.00.4215.2.v1 |
+---------------------------+----------------------------------------+---------------+------------------+
||                                          ProcessorFeatures                                          ||
|+-------------------------------------------------------------------+---------------------------------+|
||                               Name                                |              Value              ||
|+-------------------------------------------------------------------+---------------------------------+|
||  coreCount                                                        |  8                              ||
||  threadsPerCore                                                   |  1                              ||
|+-------------------------------------------------------------------+---------------------------------+|
Bash

TimeStamp-3: インスタンスプロセッサ機能設定の変更

次に、以下のコマンドを実行して、インスタンスのプロセッサ機能設定を 4 コア、コアあたり 1 スレッドに変更します:

aws rds modify-db-instance --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance-8  \
--db-instance-class db.r7i.8xlarge \
--processor-features "Name=coreCount,Value=4" "Name=threadsPerCore,Value=1" \
--apply-immediately
Bash

インスタンスの詳細を確認します :

aws rds describe-db-instances --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance-8 \
--query 'DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier,Engine:Engine,EngineVersion:EngineVersion,ProcessorFeatures:ProcessorFeatures,DBInstanceClass:DBInstanceClass}'
Bash

次のような出力が得られます :

-----------------------------------------------------------------------------------
|                                DescribeDBInstances                               |
+-----------------+----------------------------+---------------+-------------------+
| DBInstanceClass |   DBInstanceIdentifier     |    Engine     |   EngineVersion   |
+-----------------+----------------------------+---------------+-------------------+
|  db.r7i.8xlarge |  rfs-test-ocpu-instance-8  |  sqlserver-ee |  16.00.4215.2.v1  |
+-----------------+----------------------------+---------------+-------------------+
||                                ProcessorFeatures                               ||
|+-----------------------------------------------------+--------------------------+|
||                        Name                         |          Value           ||
|+-----------------------------------------------------+--------------------------+|
||  coreCount                                          |  4                       ||
||  threadsPerCore                                     |  1                       ||
|+-----------------------------------------------------+--------------------------+|
Bash

TimeStamp-4: 最新の復元可能時刻への PITR

次に、インスタンスを最新の復元可能時刻に復元します。

aws rds restore-db-instance-to-point-in-time --region us-west-2 \
--vpc-security-group-ids sg-XXXXX \
--db-subnet-group-name rds-db-sub-net-group-xxx \
--publicly-accessible \
--source-db-instance-identifier rfs-test-ocpu-instance-8 \
--target-db-instance-identifier rfs-test-ocpu-instance-9 \
--use-latest-restorable-time
Bash

復元されたインスタンスに対して describe コマンドを実行します:

aws rds describe-db-instances --region us-west-2 \
--db-instance-identifier rfs-test-ocpu-instance-9 \
--query 'DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier,Engine:Engine,EngineVersion:EngineVersion,ProcessorFeatures:ProcessorFeatures,DBInstanceClass:DBInstanceClass}' \
Bash

次のような出力が得られます :

------------------------------------------------------------------------------------
|                                DescribeDBInstances                               |
+-----------------+----------------------------+---------------+-------------------+
| DBInstanceClass |   DBInstanceIdentifier     |    Engine     |   EngineVersion   |
+-----------------+----------------------------+---------------+-------------------+
|  db.r7i.8xlarge |  rfs-test-ocpu-instance-9  |  sqlserver-ee |  16.00.4215.2.v1  |
+-----------------+----------------------------+---------------+-------------------+
||                                ProcessorFeatures                               ||
|+-----------------------------------------------------+--------------------------+|
||                        Name                         |          Value           ||
|+-----------------------------------------------------+--------------------------+|
||  coreCount                                          |  8                       ||
||  threadsPerCore                                     |  1                       ||
|+-----------------------------------------------------+--------------------------+||
Bash

ポイントインタイムリカバリ (PITR) の時点で、ソースインスタンスは db.r7i.8xlarge インスタンスタイプで実行されており、4 コア、コアあたり 1 スレッドの構成となっています。しかし、復元されたインスタンス (最新の復元可能時刻を使用) の CPU 設定は、8 コア、コアあたり 1 スレッドに設定されています。

クリーンアップ

RDS for SQL Server インスタンスが不要になった場合は、追加料金の発生を避けるために削除してください。

結論

この投稿では、Amazon RDS for SQL Server の CPU 最適化機能を使用して vCPU 割り当てをカスタマイズし、特定のワークロードのコストを削減し、パフォーマンスを最適化する方法を実演しました。新しいインスタンスの作成、既存インスタンスの変更、CPU 最適化設定でのスナップショットからの復元とポイントインタイムリカバリについて説明しました。CPU リソースを微調整することで、アプリケーションが必要とするパフォーマンスを維持しながら、より良いコスト最適化を実現できます。
Amazon RDS for SQL Server とその機能の詳細については、Amazon RDS ユーザーガイドを参照してください。

翻訳はソリューションアーキテクトの Yoshinori Sawada が担当しました。原文はこちらです。


著者について

Srikanth Katakam

Srikanth Katakam

Srikanth は、Amazon RDS やAmazon RDS Custom for SQL Server などの Amazon RDS 商用データベースエンジンを専門とするAWS のシニアデータベースエンジニアです。豊富な技術的専門知識を持っていて、AWS のお客様の多様なニーズに応える堅牢な機能の設計と開発に情熱を注いでいます。

Sandesh Bhandari

Sandesh Bhandari

Sandesh は、AWS のソフトウェア開発エンジニアで、Amazon RDS for SQL Server と RDS Custom for SQL Server に取り組んでいます。彼はスケーラブルなデータベースソリューションの構築と複雑な技術的問題の解決を専門としています。詳細な分析とイノベーションに重点を置き、AWS データベースサービスの信頼性と効率性を向上させる機能を開発しています。