PolarDB for MySQL の最適なパフォーマンスを実現するため、PolarDB ではスレッドプール機能を提供しています。この機能により、スレッドとセッションが分離され、少数のスレッドで多数のアクティブセッションからのタスクを処理できます。
メリット
デフォルトでは、MySQL はセッション排他モードを採用しており、各セッションに対して専用のスレッドが作成されます。多数のセッションが存在すると、リソース競合が激化し、パフォーマンスが低下します。また、過剰なスレッドスケジューリングや頻繁なキャッシュミスも、パフォーマンスを著しく低下させます。
PolarDB のスレッドプールは、異なる種類の SQL ステートメントに対して優先度および同時実行制御のメカニズムを実装しています。接続数を最適なレベルに維持することで、高接続・高同時実行性の条件下でも PolarDB データベースが高パフォーマンスを発揮できるようになります。スレッドプールの主なメリットは以下のとおりです。
多数のスレッドが並行して実行される場合、スレッドプールは自動的に並行スレッド数を適切な範囲に調整し、過剰なスレッドスケジューリングおよび頻繁なキャッシュミスを回避します。
多数のトランザクションが並行して実行される場合、スレッドプールはステートメントおよびトランザクションに異なる優先度を割り当て、それぞれの同時実行数を個別に制御することで、リソース競合を軽減します。
管理用の SQL ステートメントにはより高い優先度が割り当てられるため、新規接続の確立、管理操作、モニタリングなどの処理が、システム負荷が高い状況下でも安定して実行されます。
複雑な SQL ステートメントには低い優先度が割り当てられ、その同時実行数の上限が制限されます。これにより、システムリソースを枯渇させたり、データベース全体のサービス停止を引き起こしたりするリスクを防止します。
スレッドプールの使用方法
スレッドプールには以下のパラメーターが関係します。これらのパラメーターはコンソールから変更可能です。詳細については、「クラスターおよびノードのパラメーターの設定」をご参照ください。
PolarDBコンソールのすべてのクラスターパラメーターには、MySQL 構成ファイルとの互換性のために loose_ というプレフィックスが付いています。PolarDBコンソールでパラメーターを変更するには、loose_ プレフィックスが付いたパラメーターを選択します。
パラメーター名 | 説明 |
loose_thread_pool_enabled | スレッドプール機能を有効化するかどうかを指定します。有効な値は以下のとおりです。
説明
|
loose_thread_pool_size | スレッドプール内のスレッドグループ数です。有効範囲は、クラスターのプライマリノードの CPU コア数に依存します。 有効範囲:DBNodeClassCPU ~ DBNodeClassCPU × 10。デフォルト値:DBNodeClassCPU × 2。 説明
例:
|
loose_thread_pool_high_prio_mode | スレッドプール内における高優先度キューの動作モードです。有効な値は以下のとおりです。
説明 適用範囲:
|
loose_thread_pool_high_prio_tickets | 高優先度キューへの単一エントリに対するチケット数です。 有効範囲:0 ~ 4294967295。デフォルト値:4294967295。 説明 適用範囲:
|
loose_thread_pool_idle_timeout | スレッドプール内のアイドルスレッドを解放するまでのタイムアウト期間です。この期間内にリクエストを処理しなかったアイドルスレッドは解放されます。 有効範囲:0 ~ 31536000。デフォルト値:60。単位:秒。 説明 適用範囲:
|
loose_thread_pool_oversubscribe | 各スレッドグループ内で許可されるアクティブスレッド数です。アクティブスレッドとは、SQL ステートメントを実行中のスレッドを指します。 有効範囲:1 ~ 1000。デフォルト値:20。 |
loose_thread_pool_stall_limit | スレッドプールが停止状態にあると判断するための時間しきい値です。 スレッドプールが停止状態になると、システムは新しいスレッドを作成して SQL ステートメントの処理を行います。 有効範囲:1 ~ 18446744073709551615。デフォルト値:10。単位:ミリ秒。 説明 MySQL 5.6 の場合、デフォルト値は 30 ミリ秒です。 |
loose_bypass_thread_pool_ips | スレッドプールによる制約を受けないクライアントの IP アドレスを指定します。これにより、スレッドプールが満杯の状態でも、管理操作用の SQL ステートメントを実行できます。 設定例: 説明 適用範囲:MySQL 8.0.1(リビジョンバージョン 8.0.1.1.19 以降)。 |
loose_bypass_thread_pool_check_ignore_proxy | プロキシ経由で接続されたクライアントの IP アドレスを、
説明 適用範囲:MySQL 8.0.1(リビジョンバージョン 8.0.1.1.19 以降)。 |
loose_thread_pool_high_priority_users | 高優先度のデータベースアカウントを指定します。設定後、これらのアカウントからのリクエストは、スレッドプールの高優先度キューに配置され、優先的に処理されます。 設定例: 説明
|
loose_thread_pool_mark_ddl_thread_timeout_sec | スレッドプール内の DDL スレッドのタイムアウトしきい値を指定します。この時間を経過すると、DDL スレッドはタイムアウトとしてマークされ、システムは新しいスレッドを作成してリクエストを処理します。 有効範囲:0 ~ 864000。デフォルト値:600。単位:秒。 説明 適用範囲:MySQL 8.0.1(リビジョンバージョン 8.0.1.1.19 以降)。 |
loose_thread_pool_mark_ddl_thread_timeout_immediately | スレッドプールの負荷が高く、低優先度キューが積み上げられた際に、DDL スレッドを即座にタイムアウトとしてマークするかどうかを指定します。この場合、システムは新しいスレッドを作成してリクエストを処理します。このパラメーターは、大量のバッチ DDL 操作を頻繁に実行するビジネスシナリオに適しています。有効な値は以下のとおりです。
説明 適用範囲:MySQL 8.0.1(リビジョンバージョン 8.0.1.1.19 以降)。 |
スレッドプールのステータスの照会
以下のコマンドを実行して、スレッドプールのステータスを照会できます。
select * from information_schema.THREAD_POOL_STATUS;以下に、返される結果の例を示します。
mysql> select * from information_schema.THREAD_POOL_STATUS;
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
| ID | THREAD_COUNT | ACTIVE_THREAD_COUNT | WAITING_THREAD_COUNT | DUMP_THREAD_COUNT | SLOW_THREAD_TIMEOUT_COUNT | CONNECTION_COUNT | LOW_QUEUE_COUNT | HIGH_QUEUE_COUNT |
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
| 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 6 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 9 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 10 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 11 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 12 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 13 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 14 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 15 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 16 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 17 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 18 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 19 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 20 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 21 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 22 | 2 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 23 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 24 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 25 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 26 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 27 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 28 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 29 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 30 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 31 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 32 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 33 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 34 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 35 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 36 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 37 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 38 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 39 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 40 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 41 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 42 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 43 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 44 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 45 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 46 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 47 | 3 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 48 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 49 | 3 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 50 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 51 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 52 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 53 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 54 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 55 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 56 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 57 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 58 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 59 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 60 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 61 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 62 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 63 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
64 rows in set (0.00 sec)各メトリックの説明は以下のとおりです。
パラメーター | 説明 |
ID | スレッドプールの ID です。 |
THREAD_COUNT | スレッドプール内のスレッド数です。 |
ACTIVE_THREAD_COUNT | スレッドプール内のアクティブスレッド数です。 |
WAITING_THREAD_COUNT | スレッドプール内でディスク I/O やトランザクションコミットを待機中のスレッド数です。 |
DUMP_THREAD_COUNT | スレッドプール内の DUMP クラスの接続保持型接続数です。 |
SLOW_THREAD_TIMEOUT_COUNT | タイムアウトとしてマークされたスレッドプール内のスレッド数です。 |
CONNECTION_COUNT | スレッドプール内で確立されたユーザー接続数です。 |
LOW_QUEUE_COUNT | スレッドプールの低優先度キュー内の待機リクエスト数です。 |
HIGH_QUEUE_COUNT | スレッドプールの高優先度キュー内の待機リクエスト数です。 |
Sysbench テスト
以下のグラフは、スレッドプールを有効化した場合と無効化した場合のパフォーマンス比較を示しています。テスト結果より、スレッドプールは高い同時実行性を要求するシナリオにおいて、顕著なパフォーマンス向上を実現することが確認されています。
図 1. インデックスなしでの更新の OLTP テスト
図 2. 書き込み専用の OLTP テスト
図 3. 読み取り専用の OLTP テスト
図 4. 読み取り/書き込みの OLTP テスト