MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  InnoDB のスレッド並列性の構成

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

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

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

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

構成オプション 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) によって指定されます。 ロックを待機しているスレッドには、そのロックが使用可能になるとチケットが 1 つ与えられます。

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

MySQL のスレッド処理に関する一般的なパフォーマンス情報については、セクション5.1.12.1「接続インタフェース」を参照してください。


関連キーワード:  InnoDB, テーブル, 構成, ロック, 制限, 圧縮, 実行, thread, スペース, インデックス