ApsaraDB for RDSは、パフォーマンスを最大化するためのスレッドプール機能を提供します。 この機能は、スレッドをセッションから分離します。 これにより、セッションはスレッドを共有し、より少ないスレッドでより多くのタスクを完了できます。
メリット
デフォルトでは、各セッションはMySQLに排他スレッドを作成します。 多数のセッションがアクティブな場合、それらはリソースを求めて競合します。 さらに、データベースシステムは、スレッドスケジューリングの重いワークロードを処理する必要があり、キャッシュ内の大量のデータが無効になります。 これにより、データベースのパフォーマンスが低下します。
ApsaraDB for RDSのスレッドプールは、ステートメントタイプに基づいてSQLステートメントに優先順位を付与します。 スレッドプールは、接続数を制限するための同時実行制御メカニズムも提供します。 これにより、多数の同時接続が発生した場合に高いデータベースパフォーマンスが保証されます。 スレッドプールの利点は次のとおりです。
- 多数のスレッドが同時に実行されている場合、スレッドプールは自動的に同時スレッドの数を適切な範囲に制限します。 この範囲内では、データベースシステムはスレッドスケジューリングの中程度のワークロードを処理し、キャッシュ内のほとんどのデータは有効なままです。
- 多数のトランザクションが同時に実行されると、スレッドプールはSQL文とトランザクションに異なる優先順位を自動的に付与します。 優先度に基づいて、スレッドプールは同時ステートメントとトランザクションの数を個別に制限します。 これにより、リソースの競合が軽減されます。
- スレッドプールは、データの管理に使用されるSQLステートメントに高い優先度を付与し、これらのステートメントが優先的に実行されるようにします。 これにより、データベースシステムの負荷が高い場合でも、接続の確立、管理、監視などの操作を安定して実行できます。
- スレッドプールは、データのクエリに使用される複雑なSQLステートメントに低い優先度を付与し、同時ステートメントの最大数を制限します。 これにより、多数の複雑なSQL文がリソースを使い果たしてデータベースサービスを利用できなくなるのを防ぎます。
前提条件
RDSインスタンスがMySQL 5.6、5.7、または8.0を実行しています。
スレッドプールを使用する
次の表に、スレッドプールのパラメーターを示します。 これらのパラメーターは、ApsaraDB for RDSコンソールで設定できます。 詳細は、「インスタンスパラメーターの変更」をご参照ください。
パラメーター | 説明 |
thread_pool_enabled | スレッドプール機能を有効にするかどうかを指定します。 有効な値:
デフォルト値: ON。 説明
|
thread_pool_サイズ | スレッドプール内のグループの数。 デフォルト値: 4。 スレッドプール内のスレッドは、グループに均等に分割され、グループごとに管理されます。 |
thread_pool_oversubscribe | グループごとに許可されるアクティブなスレッドの数。 デフォルト値: 32。 スレッドは、SQL文を実行している場合はアクティブです。 ただし、SQL文が次のいずれかの状態にある場合、スレッドは非アクティブです。
|
スレッドプールのステータスの照会
show status like "thread_pool %";
例:
mysql> "thread_pool %" のようなステータスを表示します。+ ---------------------------- + -------
| Variable_name | 値 |
+ ---------------------------- + -------
| thread_pool_active_threads | 1 |
| thread_pool_big_threads | 0 |
| thread_pool_dml_threads | 0 |
| thread_pool_idle_threads | 19 |
| thread_pool_qry_threads | 0 |
| thread_pool_total_threads | 20 |
| thread_pool_trx_threads | 0 |
| thread_pool_wait_threads | 0 |
+ ---------------------------- + -------
セットの8行 (0.00秒)
次の表に、スレッドプールのステータスを示すパラメーターを示します。
パラメーター | 説明 |
thread_pool_active_スレッド | スレッドプール内のアクティブなスレッドの数。 |
thread_pool_big_スレッド | スレッドプールで複雑なSQL文を実行しているスレッドの数。 複雑なSQL文には、サブクエリ、集計関数、およびGROUP BYやLIMITなどの句が含まれます。 |
thread_pool_dml_スレッド | スレッドプールでデータ操作言語 (DML) ステートメントを実行しているスレッドの数。 |
thread_pool_idle_スレッド | スレッドプール内のアイドル状態のスレッドの数。 |
thread_pool_qry_スレッド | スレッドプールで単純なSQL文を実行しているスレッドの数。 |
thread_pool_total_スレッド | スレッドプール内のスレッドの総数。 |
thread_pool_trx_スレッド | スレッドプールでトランザクションを実行しているスレッドの数。 |
thread_pool_wait_スレッド | ディスクI/Oを待機しているスレッドと、スレッドプールでコミットされるトランザクションを待機しているスレッドの数。 |
SysBenchを使用してスレッドプールをテストする
次の図は、スレッドプールが有効と無効のビジネスシナリオ間のパフォーマンスの比較を示しています。 テスト結果に基づいて、スレッドプールは、多数の同時並行セッションが発生した場合にデータベースのパフォーマンスを大幅に向上させます。