ちょっと話題の記事

RDS for MySQLでもPerformance Insightsで性能確認が可能になりました

先日MySQL互換AuroraでPerformance Insightsがサポートされて性能確認が可能になりましたが、本日RDS for MySQLでもPerformance Insightsが使用可能になったのでレポートします。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

先日MySQL互換AuroraでPerformance Insightsがサポートされて性能確認が可能になりましたが、本日RDS for MySQLでもPerformance Insightsが使用可能になったのでレポートします。

Performance Insights

Performance InsightsはRDSで時間がかかっている箇所を可視化してパフォーマンス確認を行うためのツールです。今回MySQLでサポートされて以下の4DBエンジンでサポートされています。MySQLではバージョンが5.7.22以降となっているので、MySQL 5.7の最新バージョンからのサポートとなるので注意して下さい。

  • Amazon Aurora MySQL (MySQL 5.6 version 1.17.3 以降)
  • Amazon RDS MySQL (MySQL 5.7 version 5.7.22 以降)
  • Amazon Aurora PostgreSQL
  • Amazon RDS PostgreSQL version 10

注意

Performance Insightsはt2系のDBインスタンスをサポートしていません

Performance Insightsの情報は自動的にKMSで暗号化されますが、暗号化の鍵は変更できません。

Aurora MySQLとRDS for MySQLではPerformance Insightsを有効にすると以下のパラメータが自動で有効になります。performance_schemaを有効にすることで性能に影響が出るため設定には負荷影響を確認してから設定を行う必要があります。

パラメータ
performance_schema 1
performance-schema-consumer-events-waits-current ON
performance-schema-instrument 'wait/%=ON'
performance-schema-consumer-global-instrumentation ON
performance-schema-consumer-thread-instrumentation ON

なお、上記パラメータはParameter Groupの内容を上書きしないので、明示的にParameter Groupでperformance_schema0を設定している場合には0のまま無効となります。performance_schemaが無効の状態の場合はPerformance Insightsが待機内容を判断できず待機内容を表示できません。

やってみる

通常の状態

以下の内容でRDSを起動します。

  • リージョン: 東京
  • DBエンジン: MySQL
  • バージョン: 5.7.22
  • インスタンスクラス: db.m4.large
  • Parameter Group: デフォルト状態の内容

[詳細設定] の設定の中でパフォーマンスインサイトという項目が増えています。ここでパフォーマンスインサイトの有効化を選択します。

あとは普通のRDSを起動します。

起動後にperformance_schemaのパラメータを確認すると以下のようにperformance_schemaが有効になっています

mysql> show variables like 'performance%';
+----------------------------------------------------------+-------+
| Variable_name                                            | Value |
+----------------------------------------------------------+-------+
| performance_schema                                       | ON    |
| performance_schema_accounts_size                         | -1    |
| performance_schema_digests_size                          | 10000 |
| performance_schema_events_stages_history_long_size       | 10000 |
| performance_schema_events_stages_history_size            | 10    |
| performance_schema_events_statements_history_long_size   | 10000 |
| performance_schema_events_statements_history_size        | 10    |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_transactions_history_size      | 10    |
| performance_schema_events_waits_history_long_size        | 10000 |
| performance_schema_events_waits_history_size             | 10    |
| performance_schema_hosts_size                            | -1    |
| performance_schema_max_cond_classes                      | 80    |
| performance_schema_max_cond_instances                    | -1    |
| performance_schema_max_digest_length                     | 1024  |
| performance_schema_max_file_classes                      | 80    |
| performance_schema_max_file_handles                      | 32768 |
| performance_schema_max_file_instances                    | -1    |
| performance_schema_max_index_stat                        | -1    |
| performance_schema_max_memory_classes                    | 320   |
| performance_schema_max_metadata_locks                    | -1    |
| performance_schema_max_mutex_classes                     | 210   |
| performance_schema_max_mutex_instances                   | -1    |
| performance_schema_max_prepared_statements_instances     | -1    |
| performance_schema_max_program_instances                 | -1    |
| performance_schema_max_rwlock_classes                    | 40    |
| performance_schema_max_rwlock_instances                  | -1    |
| performance_schema_max_socket_classes                    | 10    |
| performance_schema_max_socket_instances                  | -1    |
| performance_schema_max_sql_text_length                   | 1024  |
| performance_schema_max_stage_classes                     | 150   |
| performance_schema_max_statement_classes                 | 193   |
| performance_schema_max_statement_stack                   | 10    |
| performance_schema_max_table_handles                     | -1    |
| performance_schema_max_table_instances                   | -1    |
| performance_schema_max_table_lock_stat                   | -1    |
| performance_schema_max_thread_classes                    | 50    |
| performance_schema_max_thread_instances                  | -1    |
| performance_schema_session_connect_attrs_size            | 512   |
| performance_schema_setup_actors_size                     | -1    |
| performance_schema_setup_objects_size                    | -1    |
| performance_schema_users_size                            | -1    |
+----------------------------------------------------------+-------+
42 rows in set (0.00 sec)

今回はPercona社で開発しているsysbench-tpccでデータをロードしてみます。

$ sudo yum install mysql git
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bas
$ sudo yum -y install sysbench
$ git clone https://github.com/Percona-Lab/sysbench-tpcc.git
$ cd sysbench-tpcc
$ ./tpcc.lua --db-driver=mysql --mysql-user=awsuser --mysql-password=mypassword \
  --mysql-db=mydb --mysql-host=dbhost.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com \
  --threads=10 --tables=10 --scale=1 prepare

Performance Insightsのダッシュボードを確認すると、DBで時間がかかっている箇所が分かります。

performance_schemaが無効の状態

ここでperformance_schemaを明示的に無効にした状態でどうなるか確認してみます。

以下のようなperformance_schemaだけを0に設定したParameter Groupを準備してRDSを起動します。

$ aws rds describe-db-parameters --db-parameter-group-name no-pf | jq '.Parameters | map(select(.Source == "user"))'
[
  {
    "ApplyMethod": "pending-reboot",
    "Description": "Enables or disables the Performance Schema",
    "DataType": "boolean",
    "IsModifiable": true,
    "AllowedValues": "0,1",
    "Source": "user",
    "ParameterValue": "0",
    "ParameterName": "performance_schema",
    "ApplyType": "static"
  }
]

起動後にperformance_schemaのパラメータを確認すると以下のようにperformance_schemaが無効になっています

mysql> show variables like 'performance%';
+----------------------------------------------------------+-------+
| Variable_name                                            | Value |
+----------------------------------------------------------+-------+
| performance_schema                                       | OFF   |
| performance_schema_accounts_size                         | 0     |
| performance_schema_digests_size                          | 0     |
| performance_schema_events_stages_history_long_size       | 0     |
| performance_schema_events_stages_history_size            | 0     |
| performance_schema_events_statements_history_long_size   | 0     |
| performance_schema_events_statements_history_size        | 0     |
| performance_schema_events_transactions_history_long_size | 0     |
| performance_schema_events_transactions_history_size      | 0     |
| performance_schema_events_waits_history_long_size        | 0     |
| performance_schema_events_waits_history_size             | 0     |
| performance_schema_hosts_size                            | 0     |
| performance_schema_max_cond_classes                      | 0     |
| performance_schema_max_cond_instances                    | 0     |
| performance_schema_max_digest_length                     | 0     |
| performance_schema_max_file_classes                      | 0     |
| performance_schema_max_file_handles                      | 0     |
| performance_schema_max_file_instances                    | 0     |
| performance_schema_max_index_stat                        | 0     |
| performance_schema_max_memory_classes                    | 0     |
| performance_schema_max_metadata_locks                    | 0     |
| performance_schema_max_mutex_classes                     | 0     |
| performance_schema_max_mutex_instances                   | 0     |
| performance_schema_max_prepared_statements_instances     | 0     |
| performance_schema_max_program_instances                 | 0     |
| performance_schema_max_rwlock_classes                    | 0     |
| performance_schema_max_rwlock_instances                  | 0     |
| performance_schema_max_socket_classes                    | 0     |
| performance_schema_max_socket_instances                  | 0     |
| performance_schema_max_sql_text_length                   | 0     |
| performance_schema_max_stage_classes                     | 0     |
| performance_schema_max_statement_classes                 | 0     |
| performance_schema_max_statement_stack                   | 0     |
| performance_schema_max_table_handles                     | 0     |
| performance_schema_max_table_instances                   | 0     |
| performance_schema_max_table_lock_stat                   | 0     |
| performance_schema_max_thread_classes                    | 0     |
| performance_schema_max_thread_instances                  | 0     |
| performance_schema_session_connect_attrs_size            | 0     |
| performance_schema_setup_actors_size                     | 0     |
| performance_schema_setup_objects_size                    | 0     |
| performance_schema_users_size                            | 0     |
+----------------------------------------------------------+-------+
42 rows in set (0.00 sec)

先ほどと同様にsysbench-tpccでデータをロードして、Performance Insightsのダッシュボードを確認します。すると、待機のスライス基準が少なくなっていることが分かります。

さいごに

AWSで一番多く使われていると思われるMySQLにもPerformance Insightsがやってきました。現時点では最新バージョンでしか使用できませんが、今後RDSの性能に異変があった場合など調査に役に立ちますので、性能影響を確認しながらできるだけPerformance Insightsを有効にしたほうが良いと思います。