MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

5.6.3.3 スレッドプール操作

スレッドプールは、それぞれクライアント接続のセットを管理するいくつかのスレッドグループから構成されます。 接続が確立されると、スレッドプールはラウンドロビン方式でそれらをスレッドグループに割り当てます。

スレッドプールは、その操作の構成に使用できるシステム変数を公開します:

スレッドグループの数を構成するには、thread_pool_size システム変数を使用します。 グループのデフォルトの数は 16 です。 この変数の設定のガイドラインについては、セクション5.6.3.4「スレッドプールのチューニング」を参照してください。

グループあたりのスレッドの最大数は 4096 (または 1 つのスレッドが内部で使用される一部のシステムでは 4095) です。

スレッドプールは接続とスレッドを区別するため、接続と、それらの接続から受信したステートメントを実行するスレッド間に固定の関係はありません。 これは、特定のスレッドがその接続からすべてのステートメントを実行するように、あるスレッドを 1 つの接続に関連付けるデフォルトのスレッド処理モデルとは異なります。

デフォルトでは、スレッドプールは各グループで一度に最大 1 つのスレッドを実行しようとしますが、最高のパフォーマンスを得るために一時的に実行できるスレッドが増える場合があります:

これは、スレッドグループがステートメントを実行するために複数のスレッドを開始している状況の例です。

スレッドプールは、増加する接続全体に拡張できるように設計されています。 さらに、アクティブに実行しているステートメントの数を制限することから発生する可能性のあるデッドロックを回避するようにも設計されています。 スレッドプールにレポートしないスレッドは、ほかのステートメントの実行を妨げないため、スレッドプールのデッドロックを引き起こすことは重要です。 そのようなステートメントの例を次に示します。

どの場合も、デッドロックを避けるため、スレッドグループが別のステートメントの実行の開始を許可できるように、ステートメントがすぐに完了しない場合、停滞中カテゴリに移動されます。 この設計により、スレッドが長時間実行するか、ブロックされた場合に、スレッドプールはスレッドを停滞中カテゴリに移動し、ステートメントの実行の残りの間、ほかのステートメントの実行を妨げません。

発生する可能性のあるスレッドの最大数は、max_connectionsthread_pool_size の合計です。 これは、すべての接続が実行モードにあり、グループあたりに追加のステートメントを待機する 1 つの追加スレッドが作成される状況で発生する可能性があります。 これは必ずしも頻繁に発生する状態ではありませんが、理論的には可能性があります。