接続マネージャースレッドは、サーバーが待機しているネットワークインタフェース上でクライアントの接続要求を処理します。どのプラットフォームでも、1 つのマネージャースレッドが TCP/IP 接続要求を処理します。Unix では、このマネージャースレッドは Unix ソケットファイルの接続要求も処理します。Windows では、1 つのマネージャースレッドが共有メモリーの接続要求を処理し、別のマネージャースレッドが名前付きパイプの接続要求を処理します。サーバーは、待機していないインタフェースを処理するスレッドは作成しません。たとえば、Windows サーバーで名前付きパイプ接続のサポートが有効になっていない場合、これらの接続を処理するスレッドは作成されません。
接続マネージャースレッドは、各クライアント接続を、その接続の認証および要求を処理する専用スレッドに関連付けます。マネージャースレッドは、必要な場合には新しいスレッドを作成しますが、なるべく回避するために、まずスレッドキャッシュを調べて接続に使用できるスレッドが含まれているかどうかを確認します。接続が終了すると、スレッドキャッシュが満杯でない場合にそのスレッドはスレッドキャッシュに返されます。
この接続スレッドモデルでは、現在接続しているクライアントと同数のスレッドが存在するため、多数の接続を処理するためにサーバーの作業負荷を拡張する必要がある場合にはいくつか欠点があります。たとえば、スレッドの作成と破棄の負荷が大きくなります。また、スタック領域などのサーバーリソースとカーネルリソースが各スレッドに必要になります。多数の同時接続に対応するには、スレッドあたりのスタックサイズは小さく保つ必要があり、結果として小さくなりすぎるか、あるいはサーバーで大量のメモリーを消費することになります。ほかのリソースを使い果たす可能性もあり、スケジューリングのオーバーヘッドがかなり大きくなる場合があります。
クライアント接続を処理するスレッドがサーバーでどのように管理されるかは、いくつかのシステム変数とステータス変数で制御および監視できます。(Server System VariablesおよびServer Status Variablesを参照してください。)
スレッドキャッシュのサイズは
thread_cache_size
システム変数によって決定されます。デフォルト値は
0 (キャッシュなし)
で、この場合、スレッドは新しい接続ごとにセットアップされ、接続の終了時に破棄されます。thread_cache_size
を N
に設定すると、N
個のアクティブでない接続スレッドをキャッシュできます。thread_cache_size
は、サーバーの起動時に設定するか、サーバーの実行中に変更することができます。関連付けられたクライアント接続が終了すると、接続スレッドはアクティブでなくなります。
キャッシュ内のスレッド数、およびキャッシュから取得できなかったため作成されたスレッドの数を監視するには、Threads_cached
および
Threads_created
ステータス変数を監視します。
サーバーの起動時または実行時に
max_connections
を設定して、同時に接続できるクライアントの最大数を制御することができます。
スレッドスタックが小さすぎると、サーバーで処理できる
SQL
ステートメントの複雑さ、ストアドプロシージャーの再帰の深さなど、メモリーを大量に消費する処理が制限されます。各スレッドに
N
バイトのスタックサイズを設定するには、サーバーを
--thread_stack=
で起動します。
N