どのようなときにスレッド プールを使用するかを理解する
既に学習したことですが、MySQL サーバーでは、新しい接続で使用できるスレッドのキャッシュが保持され、スレッドが不要になると破棄されます。
Azure Database for MySQL を使用すると、スレッド プールを構成できます。これは、サーバーで実行されているアクティブなスレッドの数を制限する、ワーカー スレッドのプールを提供する機能です。 ワークロードで、有効期間の短い接続や短いトランザクション クエリが多数ある場合は、この機能によって Azure Database for MySQL のパフォーマンスとスケーラビリティを向上させることができます。
MySQL の Enterprise エディションには、スレッド プール プラグインが用意されています。
注意
スレッド プールは Azure Database for MySQL フレキシブル サーバーの機能であり、バージョン 8.0 以降でのみサポートされています。
次のシナリオでは、スレッド プールをより効率的に使用できる可能性があります。
- 同時接続数が 500 を超える場合。
- CPU の使用率が高くなっています。
- 高い接続バーストが同時に発生する場合。
次のシナリオでは、スレッド プールの効率が下がる可能性があります。
- 非アクティブな状態が長時間続いた後にアクティビティが増える場合。
- 実行時間の長いクエリが処理を待機しない場合。
- IOPS が不十分な場合。 Azure Database for MySQL では、IOPS 制限を最大 20 K 超えるまで IOPS を追加できます。
Azure portal でスレッド プールを有効にするには:
- Azure Database for MySQL サーバーに移動し、[サーバー パラメーター] を選択します。
- 検索バーに「thread_handling」と 入力して、thread_handling パラメーターを表示します。
- 値を pool-of-threads に変更します。 既定では、このパラメーターは one-thread-per-connection に設定されています。つまり、新しい接続ごとに新しいスレッドが作成されます。
注意
thread_handling は静的パラメーターであり、サーバーの再起動時にのみ適用されます。 これは、Azure CLI を使用して変更することもできます。
パフォーマンスを向上させるための設定がさらに 2 つあります。これらは、スレッドをアクティブにしたまま次のクエリを待機できるようにするものです。 これは "バッチ実行"と呼ばれます。パラメーターは次のとおりです。
- thread_pool_batch_wait_timeout。 このパラメーターでは、スレッドが別のクエリを待機する最大時間を指定します。
- thread_pool_batch_max_time(スレッドプールバッチの最大時間)。 このパラメーターでは、クエリの実行と待機のサイクルをスレッドで繰り返す回数を指定します。
次のサーバー パラメーターを設定して、プール内のスレッドの数を定義することもできます。
- thread_pool_max_threads このパラメーターでは、プール内に同時に存在できる最大スレッド数を定義します。
- thread_pool_min_threads このパラメーターでは、接続が閉じられた後にもプールで予約される最小スレッド数を定義します。
注意
MySQL 5.6 では、スレッド プールはサポートされていません。