このトピックでは、パフォーマンス分析情報機能を使用してワークロードを監視し、関連付け分析を実行し、ApsaraDB RDS インスタンスのパフォーマンスを最適化する方法について説明します。 この機能は、RDS インスタンスのワークロードを迅速に評価し、パフォーマンスの問題を特定してサービスの安定性を確保するのに役立ちます。
前提条件
RDS インスタンスで MySQL 8.0 または MySQL 5.7 が実行されており、20190915 以降のマイナーエンジンバージョンが実行されていること。
RDS インスタンスのマイナーエンジンバージョンを表示するには、ApsaraDB RDS コンソールにログインし、[基本情報] ページに移動します。 ページの [構成情報] セクションで、[カーネルバージョンのアップグレード] ボタンが表示されているかどうかを確認できます。 ボタンが表示されている場合は、ボタンをクリックして RDS インスタンスのマイナーエンジンバージョンを表示および更新できます。 ボタンが表示されていない場合は、RDS インスタンスで最新のマイナーエンジンバージョンが実行されています。 詳細については、「マイナーエンジンバージョンを更新する」をご参照ください。
概要
パフォーマンス分析情報機能は、次の 2 つの部分で構成されています。
オブジェクト統計
オブジェクト統計は、インデックスと次のテーブルから統計をクエリします。
TABLE_STATISTICS: 読み取りおよび変更されたデータを含む行を記録します。
INDEX_STATISTICS: インデックスから読み取られたデータを含む行を記録します。
パフォーマンスポイント
パフォーマンスポイントは、RDS インスタンスのパフォーマンスの詳細を収集します。 これらの詳細を使用して、SQL 文のオーバーヘッドを迅速かつ正確に定量化できます。 パフォーマンスポイントは、次の 3 つの側面からデータベースのパフォーマンスを測定します。
CPU: SQL 文の実行に費やされた合計時間、および CPU が SQL 文の実行に費やした時間などが含まれます。
ロック: サーバー上のメタデータロック、ストレージトランザクションロック、デバッグモードのみの相互排他、およびリーダーライターロックなどのロックによって占有された時間が含まれます。
I/O: データファイルの読み取りと書き込み、ログファイルの書き込み、バイナリログの読み取り、REDO ログの読み取り、REDO ログの非同期読み取りなどの操作の実行にかかる時間が含まれます。
オブジェクト統計を使用する
OPT_TABLESTAT パラメーターと OPT_INDEXSTAT パラメーターの値が ON であることを確認します。 例:
mysql> show variables like "opt_%_stat"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | opt_indexstat | ON | | opt_tablestat | ON | +---------------+-------+ // パラメータが有効になっていることを確認します。information_schema データベースの TABLE_STATISTICS または INDEX_STATISTICS テーブルをクエリして、テーブルまたはインデックスの統計を取得します。 例:
mysql> select * from TABLE_STATISTICS limit 10; +--------------+--------------+-----------+--------------+------------------------+---------------+--------------+--------------+ | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED | ROWS_CHANGED_X_INDEXES | ROWS_INSERTED | ROWS_DELETED | ROWS_UPDATED | +--------------+--------------+-----------+--------------+------------------------+---------------+--------------+--------------+ | mysql | db | 2 | 0 | 0 | 0 | 0 | 0 | | mysql | engine_cost | 2 | 0 | 0 | 0 | 0 | 0 | | mysql | proxies_priv | 1 | 0 | 0 | 0 | 0 | 0 | | mysql | server_cost | 6 | 0 | 0 | 0 | 0 | 0 | | mysql | tables_priv | 2 | 0 | 0 | 0 | 0 | 0 | | mysql | user | 7 | 0 | 0 | 0 | 0 | 0 | | test | sbtest1 | 1686 | 142 | 184 | 112 | 12 | 18 | | test | sbtest10 | 1806 | 125 | 150 | 105 | 5 | 15 | | test | sbtest100 | 1623 | 141 | 182 | 110 | 10 | 21 | | test | sbtest11 | 1254 | 136 | 172 | 110 | 10 | 16 | +--------------+--------------+-----------+--------------+------------------------+---------------+--------------+--------------+ mysql> select * from INDEX_STATISTICS limit 10; +--------------+--------------+------------+-----------+ | TABLE_SCHEMA | TABLE_NAME | INDEX_NAME | ROWS_READ | +--------------+--------------+------------+-----------+ | mysql | db | PRIMARY | 2 | | mysql | engine_cost | PRIMARY | 2 | | mysql | proxies_priv | PRIMARY | 1 | | mysql | server_cost | PRIMARY | 6 | | mysql | tables_priv | PRIMARY | 2 | | mysql | user | PRIMARY | 7 | | test | sbtest1 | PRIMARY | 2500 | | test | sbtest10 | PRIMARY | 3007 | | test | sbtest100 | PRIMARY | 2642 | | test | sbtest11 | PRIMARY | 2091 | +--------------+--------------+------------+-----------+ // テーブルまたはインデックスの統計を取得します。次の表は、上記の例の パラメーター について説明しています。
パラメーター
説明
TABLE_SCHEMA
データベースの名前。
TABLE_NAME
テーブルの名前。
ROWS_READ
テーブルから読み取られた行数。
ROWS_CHANGED
テーブルで変更された行数。
ROWS_CHANGED_X_INDEXES
テーブルでインデックスを使用して変更された行数。
ROWS_INSERTED
テーブルに挿入された行数。
ROWS_DELETED
テーブルから削除された行数。
ROWS_UPDATED
テーブルで更新された行数。
INDEX_NAME
インデックスの名前。
パフォーマンスポイントを使用する
RDS インスタンスのグローバル変数設定を表示します。 RDS インスタンスのグローバル変数設定を表示します。正常な例は以下のとおりです。
mysql> show variables like "%performance_point%"; +---------------------------------------+-------+ | Variable_name | Value | +---------------------------------------+-------+ | performance_point_dbug_enabled | OFF | | performance_point_enabled | ON | | performance_point_iostat_interval | 2 | | performance_point_iostat_volume_size | 10000 | | performance_point_lock_rwlock_enabled | ON | +---------------------------------------+-------+ // パフォーマンスポイントが有効になっていることを確認します。説明これらの変数が見つからない場合は、RDS インスタンスが「前提条件」セクションで説明されているバージョン要件を満たしているかどうかを確認してください。
performance_schema データベースの events_statements_summary_by_digest_supplement テーブルをクエリして、さまざまなディメンションの上位 10 件の SQL 文を取得します。 例:
mysql> select * from events_statements_summary_by_digest_supplement limit 10; +--------------------+----------------------------------+-------------------------------------------+--------------+ | SCHEMA_NAME | DIGEST | DIGEST_TEXT | ELAPSED_TIME | ...... +--------------------+----------------------------------+-------------------------------------------+--------------+ | NULL | 6b787dd1f9c6f6c5033120760a1a82de | SELECT @@`version_comment` LIMIT ? | 932 | | NULL | 2fb4341654df6995113d998c52e5abc9 | SHOW SCHEMAS | 2363 | | NULL | 8a93e76a7846384621567fb4daa1bf95 | SHOW VARIABLES LIKE ? | 17933 | | NULL | dd148234ac7a20cb5aee7720fb44b7ea | SELECT SCHEMA ( ) | 1006 | | information_schema | 2fb4341654df6995113d998c52e5abc9 | SHOW SCHEMAS | 2156 | | information_schema | 74af182f3a2bd265678d3dadb53e08da | SHOW TABLES | 3161 | | information_schema | d3a66515192fcb100aaef6f8b6e45603 | SELECT * FROM `TABLE_STATISTICS` LIMIT ? | 2081 | | information_schema | b3726b7c4c4db4b309de2dbc45ff52af | SELECT * FROM `INDEX_STATISTICS` LIMIT ? | 2384 | | information_schema | dd148234ac7a20cb5aee7720fb44b7ea | SELECT SCHEMA ( ) | 129 | | test | 2fb4341654df6995113d998c52e5abc9 | SHOW SCHEMAS | 342 | +--------------------+----------------------------------+-------------------------------------------+--------------+ // 上位 10 件の SQL 文を取得します。次の表は、上記の例の パラメーター について説明しています。
パラメーター
説明
SCHEMA_NAME
データベースの名前。
DIGEST
DIGEST_TEXT パラメーター から取得した 64 バイトのハッシュ文字列。
DIGEST_TEXT
SQL 文のダイジェスト。
ELAPSED_TIME
SQL 文の実行に費やされた合計時間。単位: マイクロ秒。
CPU_TIME
CPU が SQL 文の実行に費やした時間。単位: マイクロ秒。
SERVER_LOCK_TIME
SQL 文の実行中にサーバー上のメタデータロックによって占有された時間。単位: マイクロ秒。
TRANSACTION_LOCK_TIME
SQL 文の実行中にストレージトランザクションロックによって占有された時間。単位: マイクロ秒。
MUTEX_SPINS
SQL 文の実行中にトリガーされたミューテックススピンの数。
MUTEX_WAITS
SQL 文の実行中にミューテックスによってトリガーされたスピン待機の数。
RWLOCK_SPIN_WAITS
SQL 文の実行中にリーダーライターロックによってトリガーされたスピン待機の数。
RWLOCK_SPIN_ROUNDS
SQL 文の実行中にリーダーライターロックによってトリガーされたスピン待機サイクルでバックグラウンド スレッド がループしたラウンド数。
RWLOCK_OS_WAITS
SQL 文の実行中にリーダーライターロックによってトリガーされた オペレーティングシステム 待機の数。
DATA_READS
SQL 文の実行中にシステムがデータファイルからデータを読み取った回数。
DATA_READ_TIME
SQL 文の実行中にデータファイルからデータを読み取るのに費やされた時間。単位: マイクロ秒。
DATA_WRITES
SQL 文の実行中にシステムがデータファイルにデータを書き込んだ回数。
DATA_WRITE_TIME
SQL 文の実行中にデータファイルにデータを書き込むのに費やされた時間。単位: マイクロ秒。
REDO_WRITES
SQL 文の実行中にシステムがログファイルにデータを書き込んだ回数。
REDO_WRITE_TIME
SQL 文の実行中にログファイルにデータを書き込むのに費やされた時間。単位: マイクロ秒。
LOGICAL_READS
SQL 文の実行中にシステムが論理ページを読み取った回数。
PHYSICAL_READS
SQL 文の実行中にシステムが物理ページを読み取った回数。
PHYSICAL_ASYNC_READS
SQL 文の実行中にシステムが物理非同期ページを読み取った回数。
information_schema データベースの IO_STATISTICS テーブルをクエリして、最近のデータの読み取りおよび書き込み 操作 に関する情報を取得します。例:
mysql> select * from IO_STATISTICS limit 10; +---------------------+-----------+----------------+ | TIME | DATA_READ | DATA_READ_TIME | ...... +---------------------+-----------+----------------+ | 2019-08-08 09:56:53 | 73 | 983 | | 2019-08-08 09:56:57 | 0 | 0 | | 2019-08-08 09:59:17 | 0 | 0 | | 2019-08-08 10:00:55 | 4072 | 40628 | | 2019-08-08 10:00:59 | 0 | 0 | | 2019-08-08 10:01:09 | 562 | 5800 | | 2019-08-08 10:01:11 | 606 | 6910 | | 2019-08-08 10:01:13 | 609 | 6875 | | 2019-08-08 10:01:15 | 625 | 7077 | | 2019-08-08 10:01:17 | 616 | 5800 | +---------------------+-----------+----------------+ // 最新のデータの読み取りおよび書き込み操作に関する情報を取得します。次の表は、上記の例の パラメーター について説明しています。
パラメーター
説明
TIME
日付。
DATA_READ
システムがデータを読み取った回数。
DATA_READ_TIME
データの読み取りに費やされた合計時間。単位: マイクロ秒。
DATA_READ_MAX_TIME
データの読み取りに費やされた最大時間。単位: マイクロ秒。
DATA_READ_BYTES
読み取られたデータの合計量。単位: バイト。
DATA_WRITE
システムがデータを書き込んだ回数。
DATA_WRITE_TIME
データの書き込みに費やされた合計時間。単位: マイクロ秒。
DATA_WRITE_MAX_TIME
データの書き込みに費やされた最大時間。単位: マイクロ秒。
DATA_WRITE_BYTES
書き込まれたデータの合計量。単位: バイト。