Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  MySQL のクライアント接続のためのスレッドの使用方法

8.11.5.1 MySQL のクライアント接続のためのスレッドの使用方法

接続マネージャースレッドは、サーバーが待機しているネットワークインタフェース上でクライアントの接続要求を処理します。どのプラットフォームでも、1 つのマネージャースレッドが TCP/IP 接続要求を処理します。Unix では、このマネージャースレッドは Unix ソケットファイルの接続要求も処理します。Windows では、1 つのマネージャースレッドが共有メモリーの接続要求を処理し、別のマネージャースレッドが名前付きパイプの接続要求を処理します。サーバーは、待機していないインタフェースを処理するためのスレッドを作成しません。たとえば、Windows サーバーで名前付きパイプ接続のサポートが有効になっていない場合、これらの接続を処理するスレッドは作成されません。

接続マネージャースレッドは、各クライアント接続を、その接続の認証および要求を処理する専用スレッドに関連付けます。マネージャースレッドは、必要に応じて新しいスレッドを作成しますが、まずスレッドキャッシュを調べて接続に使用できるスレッドが含まれているかどうかを確認することによって、それを回避することを試みます。接続が終了すると、スレッドキャッシュが満杯でない場合は、そのスレッドがスレッドキャッシュに返されます。

この接続スレッドモデルでは、現在接続しているクライアントと同数のスレッドが存在し、多数の接続を処理するためにサーバーのワークロードを拡大する必要がある場合にはいくつか欠点があります。たとえば、スレッドの作成と破棄の負荷が大きくなります。また、各スレッドにスタック領域などのサーバーリソースとカーネルリソースが必要になります。多数の同時接続に対応するには、スレッドあたりのスタックサイズは小さく保つ必要があり、それが小さくなりすぎるか、またはサーバーで大量のメモリーを消費することになる状況につながります。ほかのリソースを使い果たす可能性もあり、スケジューリングのオーバーヘッドがかなり大きくなる可能性があります。

MySQL 5.6.10 現在、MySQL 5.6 の商用配布には、オーバーヘッドを軽減し、パフォーマンスを向上するように設計されている代替のスレッド処理モデルを提供するスレットプールプラグインが付属しています。これは、多数のクライアント接続のステートメント実行スレッドを効率的に管理して、サーバーのパフォーマンスを向上させるスレッドプールを実装します。セクション8.11.6「スレッドプールプラグイン」を参照してください。

クライアント接続を処理するスレッドをサーバーがどのように管理するかを制御し、モニターするには、いくつかのシステム変数とステータス変数が関連します。(セクション5.1.4「サーバーシステム変数」およびセクション5.1.6「サーバーステータス変数」を参照してください。)

スレッドキャッシュは、thread_cache_size システム変数によって決定されるサイズを持ちます。デフォルト値は 0 (キャッシュなし) で、この場合、スレッドは新しい接続ごとにセットアップされ、接続の終了時に破棄されます。thread_cache_sizeN に設定し、N 個の非アクティブ接続スレッドをキャッシュできるようにします。thread_cache_size はサーバーの起動時に設定するか、サーバーの実行中に変更できます。関連付けられていたクライアント接続が終了すると、接続スレッドは非アクティブになります。

キャッシュ内のスレッド数、およびスレッドをキャッシュから取得できなかったため作成されたスレッドの数をモニターするには、Threads_cached および Threads_created ステータス変数をモニターします。

サーバーの起動時または実行時に max_connections を設定して、同時に接続できるクライアントの最大数を制御できます。

スレッドスタックが小さすぎると、これによって、サーバーが処理できる SQL ステートメントの複雑さ、ストアドプロシージャーの再帰の深さ、およびその他のメモリーを大量に消費するアクションが制限されます。各スレッドに N バイトのスタックサイズを設定するには、サーバーを --thread_stack=N で起動します。