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


14.13.5 InnoDB のスレッド並列性の構成

InnoDB は、オペレーティングシステムスレッドを使用して、ユーザートランザクションからの要求を処理します。(トランザクションは、コミットまたはロールバックする前に、InnoDB に多数の要求を発行する可能性があります。)コンテキストスイッチングが効率的な、マルチコアプロセッサを備えた最新のオペレーティングシステムおよびサーバーでは、並列スレッドの数を制限することなく、ほとんどのワークロードが適切に動作します。MySQL 5.5 以降でのスケーラビリティーの向上によって、InnoDB の内部の並列実行中のスレッドの数を制限する必要性は低下します。

スレッド間のコンテキストスイッチングを最小限に抑えることが役立つ状況では、InnoDB はいくつかの手法を使用して、並列実行中のオペレーティングシステムスレッドの数 (したがって、一度に処理される要求の数) を制限できます。InnoDB がユーザーセッションからの新しい要求を受信したとき、並列実行中のスレッドの数が事前に定義された制限に達している場合、その新しい要求は再試行の前に短時間だけスリープします。スリープのあとに再スケジュールできない要求は先入れ先出しキューに入れられ、最終的に処理されます。ロックを待機しているスレッドは、並列実行中のスレッドの数にカウントされません。

並列スレッドの数は、構成パラメータ innodb_thread_concurrency を設定することによって制限できます。実行中のスレッドの数がこの制限に達すると、追加のスレッドはキューに入れられる前に、構成パラメータ innodb_thread_sleep_delay で設定されたマイクロ秒数だけスリープします。

以前は、innodb_thread_sleep_delay の最適な値を見つけるには実験が必要であり、その最適な値もワークロードによって変化する可能性がありました。MySQL 5.6.3 以降では、構成オプション innodb_adaptive_max_sleep_delayinnodb_thread_sleep_delay に許可するもっとも大きな値に設定することができ、InnoDB が、現在のスレッドスケジューリングアクティビティーに応じて innodb_thread_sleep_delay を上または下に自動的に調整します。この動的な調整は、システムにかかる負荷が軽い期間や、システムがほぼ容量いっぱいで動作している期間に、スレッドスケジューリングメカニズムがスムーズに機能するのに役立ちます。

innodb_thread_concurrency のデフォルト値や、並列スレッドの数に対する暗黙的なデフォルトの制限は、MySQL および InnoDB のさまざまなリリースで変更されてきました。現在、デフォルトでは並列実行中のスレッドの数に対して制限がないように、innodb_thread_concurrency のデフォルト値は 0 です。

InnoDB がスレッドをスリープさせるのは、並列スレッドの数が制限されている場合だけであることに注意してください。スレッドの数に対して制限がない場合は、すべてが均等に競合してスケジュールされます。つまり、innodb_thread_concurrency0 である場合は、innodb_thread_sleep_delay の値は無視されます。

スレッドの数に対して制限がある (innodb_thread_concurrency > 0 である) 場合、InnoDB は、1 つの SQL ステートメントの実行中に発行された複数の要求が innodb_thread_concurrency で設定された制限に従うことなく InnoDB に入ることを許可することによって、コンテキストスイッチングのオーバーヘッドを削減します。SQL ステートメント (結合など) は InnoDB 内の複数の行操作で構成されている可能性があるため、InnoDB は、スレッドが最小限のオーバーヘッドで繰り返しスケジュールされることを許可する指定された数のチケットを割り当てます。

新しい SQL ステートメントが開始されたとき、スレッドにはチケットがないため、innodb_thread_concurrency に従う必要があります。スレッドが InnoDB に入ることを許可されると、そのスレッドには、行操作を実行するためにあとで InnoDB に入るときに使用できる複数のチケットが割り当てられます。それらのチケットが使い果たされた場合、スレッドは削除され、ふたたび innodb_thread_concurrency に従います。それにより、そのスレッドが、待機中のスレッドの先入れ先出しキューに戻される可能性があります。スレッドがふたたび InnoDB に入ることを許可されると、チケットが再度割り当てられます。割り当てられるチケットの数は、グローバルオプション innodb_concurrency_tickets (デフォルトでは 5000、5.6.6 より前は 500) で指定されます。ロックを待機しているスレッドには、そのロックが使用可能になるとチケットが 1 つ与えられます。

これらの変数の正しい値は、環境やワークロードによって異なります。アプリケーションでどのような値が機能するかを確認するには、さまざまな値を試してください。並列実行中のスレッドの数を制限する前に、マルチコアおよびマルチプロセッサコンピュータ上の InnoDB のパフォーマンスを向上させる可能性のある構成オプション (innodb_adaptive_hash_index など) を確認してください。

MySQL のスレッド処理に関する一般的なパフォーマンス情報については、セクション8.11.5.1「MySQL のクライアント接続のためのスレッドの使用方法」を参照してください。


User Comments
Sign Up Login You must be logged in to post a comment.