ApsaraDB for RDS のパフォーマンスを最大化するために、Alibaba Cloud はスレッドプールを提供しています。この機能は、スレッドをセッションから分離し、少数のスレッドで多数のアクティブセッションのタスクを処理できるようにします。
メリット
MySQL のデフォルトの接続モデルは、1 セッションあたり 1 スレッドです。多数のセッションが接続すると、このモデルは深刻なリソースの競合を引き起こす可能性があります。システムのスレッドスケジューリングや頻繁なキャッシュの無効化によるオーバーヘッドが、パフォーマンスの急激な低下を招くことがあります。
ApsaraDB for RDS のスレッドプールは、さまざまなタイプの SQL 操作に対して優先度と同時実行制御のメカニズムを実装しています。同時実行スレッドの数を最適なレベルに保ち、高同時実行ワークロードでも高いパフォーマンスを確保します。スレッドプールの主なメリットは次のとおりです:
- 高同時実行下では、スレッドプールはアクティブスレッドの数を最適な範囲内に保ちます。これにより、過剰なスレッドスケジューリングとキャッシュの無効化を削減します。
- 同時実行トランザクションに対して、スレッドプールは SQL ステートメントとトランザクションに異なる優先度を割り当て、それらの同時実行を制御することで、リソースの競合を削減します。
- スレッドプールは管理用 SQL ステートメントを優先し、システム負荷が高い状況でも、新しい接続の作成、管理、監視などの操作が確実に実行されるようにします。
- スレッドプールは複雑な SQL ステートメントに低い優先度を割り当て、最大同時実行数の制限を適用します。これにより、多数の複雑な SQL ステートメントがシステムリソースを枯渇させ、データベースサービスが利用できなくなるのを防ぎます。
前提条件
RDS インスタンスが MySQL 5.6、5.7、8.0、または 8.4 を実行していること。
スレッドプールのパラメーター
コンソールで以下の 3 つのパラメーターを使用してスレッドプールを設定できます。詳細については、「インスタンスパラメーターの設定」をご参照ください。
| パラメーター | 説明 |
| loose_thread_pool_enabled | スレッドプール機能を有効にするかどうかを指定します。有効値:
デフォルト値: ON。 説明
|
| loose_thread_pool_size | スレッドグループの数。デフォルト値: 4。プール内のスレッドは、管理のためにこれらのグループに均等に分散されます。 |
| loose_thread_pool_oversubscribe | 各スレッドグループで許可されるアクティブスレッドの数。デフォルト値: 32。アクティブスレッドとは、SQL ステートメントを実行しているスレッドのことですが、次のケースは除きます:
|
スレッドプールのステータス
スレッドプールのステータスを確認するには、次のコマンドを実行します:
show status like "thread_pool%";例:
mysql> show status like "thread_pool%";
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| 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 rows in set (0.00 sec)
次の表で、各ステータス変数について説明します。
| ステータス変数 | 説明 |
| thread_pool_active_threads | スレッドプール内のアクティブスレッドの数。 |
| thread_pool_big_threads | スレッドプール内で複雑なクエリを実行しているスレッドの数。複雑なクエリには、サブクエリ、集計関数、または GROUP BY や LIMIT などの句を含むクエリなどが含まれます。 |
| thread_pool_dml_threads | スレッドプール内で DML ステートメントを実行しているスレッドの数。 |
| thread_pool_idle_threads | スレッドプール内のアイドルスレッドの数。 |
| thread_pool_qry_threads | スレッドプール内で単純なクエリを実行しているスレッドの数。 |
| thread_pool_total_threads | スレッドプール内のスレッドの総数。 |
| thread_pool_trx_threads | スレッドプール内でトランザクションを実行しているスレッドの数。 |
| thread_pool_wait_threads | スレッドプール内でディスク I/O またはトランザクションのコミットを待機しているスレッドの数。 |
SysBench テスト
以下の図は、スレッドプールが有効なシナリオと無効なシナリオのパフォーマンス比較を示しています。テスト結果は、スレッドプールが高同時実行ワークロードにおいて大きなパフォーマンス上の利点があることを示しています。



