PolarDB for MySQL は、データベースのパフォーマンスとリソース使用率を最適化するために、スレッドプール機能を提供します。この機能は、スレッドをセッションから分離します。セッションごとに 1 つのスレッドを使用する代わりに、この機能はスレッドのプールを使用して、アクティブなセッション全体でタスクを実行します。
メリット
従来の MySQL アーキテクチャでは、セッションごとにスレッドが作成および維持されます。多数のセッションが存在する場合、高いリソース競合、過剰なスレッドスケジューリング、およびキャッシュの無効化が発生する可能性があり、これによりクラスタのパフォーマンスが大幅に低下します。
PolarDB のスレッドプールでは、さまざまなタイプの SQL 操作に異なる優先順位を設定し、同時実行制御を実装し、接続数を最適な数に制限できます。これにより、PolarDB クラスタは、高い接続同時実行性の下でも高いパフォーマンスを維持できます。スレッドプール機能には、次のメリットがあります。
多数のスレッドが同時に実行されている場合、スレッドプールは同時実行スレッドの数を適切な範囲内で自動的に調整します。これは、過剰なスレッドスケジューリングを回避し、キャッシュの無効化のリスクを軽減するのに役立ちます。
多数のタスクが同時に実行されている場合、スレッドプールはステートメントとトランザクションに個別に優先順位を付けて管理し、同時実行ステートメントとトランザクションの数を制御します。これにより、リソース競合が軽減され、システムパフォーマンスが最適化されます。
スレッドプールは、管理関連の SQL ステートメントにより高い優先順位を付与します。これにより、接続の確立、データベース管理、データベース監視などの操作は、システム負荷が高い場合でも確実に実行されます。
スレッドプールは、複雑な SQL ステートメントにより低い優先順位を付与し、これらのステートメントの最大同時実行数を制限します。これにより、複雑なクエリによるシステムリソースの過剰な消費を防ぎ、データベースシステム全体が動作し続けるようにします。
スレッドプールの使用方法
次の表で説明されているパラメータを使用して、PolarDB コンソールでスレッドプール機能を構成できます。詳細については、「クラスタとノードパラメータを構成する」をご参照ください。
MySQL 構成ファイルとの互換性を確保するために、PolarDBコンソールのクラスタパラメータには、loose_ というプレフィックスが付いています。
パラメータ | 説明 |
loose_thread_pool_enabled | スレッドプール機能を有効にするかどうかを指定します。有効値:
説明
|
loose_thread_pool_size | スレッドプール内のスレッドグループの数。有効値は、プライマリノードの CPU コア数によって異なります。 有効値:DBNodeClassCPU ~ DBNodeClassCPU × 10。 デフォルト値:DBNodeClassCPU × 2 説明
例:
|
loose_thread_pool_high_prio_mode | 高優先度キューに追加する SQL クエリのタイプ。有効値:
デフォルト値:transactions。 説明 このパラメータは、PolarDB for MySQL 5.6 および 5.7 クラスタでのみサポートされています。 |
loose_thread_pool_high_prio_tickets | 高優先度キューに割り当てられるチケットの最大数。 有効値:0 ~ 4294967295。 デフォルト値:4294967295。 説明 このパラメータは、PolarDB for MySQL 5.6 および 5.7 クラスタでのみサポートされています。 |
loose_thread_pool_idle_timeout | アイドル状態のスレッドが解放されるまでのタイムアウトしきい値。 有効値:0 ~ 31536000。 デフォルト値:60 単位:秒。 説明 このパラメータは、PolarDB for MySQL 5.6 および 5.7 クラスタでのみサポートされています。 |
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 アドレス。これらの IP アドレスを持つクライアントは、スレッドプールが完全に占有されている場合でも、管理 SQL ステートメントを実行できます。 例:
説明 このパラメータは、リビジョンバージョン 8.0.1.1.19 の PolarDB for MySQL 8.0.1 でのみサポートされています。 |
loose_bypass_thread_pool_check_ignore_proxy | これらの IP アドレスを持つクライアントがプロキシ経由でデータベースに接続する場合に、
説明 このパラメータは、リビジョンバージョン 8.0.1.1.19 の PolarDB for MySQL 8.0.1 でのみサポートされています。 |
loose_thread_pool_high_priority_users | 高優先度データベースアカウント。これらのアカウントからのリクエストは、スレッドプールの高優先度キューに配置され、最初に処理されます。 例:
説明
|
loose_thread_pool_mark_ddl_thread_timeout_sec | スレッドプールにおける DDL 操作のタイムアウトしきい値。しきい値に達すると、DDL 操作はタイムアウトとしてラベル付けされ、システムは操作を実行するための新しいスレッドを自動的に作成します。 有効値:0 ~ 864000。 デフォルト値:600。 単位:秒。 説明 このパラメータは、リビジョンバージョン 8.0.1.1.19 の PolarDB for MySQL 8.0.1 でのみサポートされています。 |
loose_thread_pool_mark_ddl_thread_timeout_immediately | スレッドプールが高負荷状態で、低優先度キューが積み重なっている場合に、DDL ステートメントをすぐにタイムアウトとしてラベル付けし、ステートメントを処理するための新しいスレッドを作成するかどうかを指定します。このパラメータは、多数の DDL ステートメントを実行する必要があるシナリオに適用されます。有効値:
説明 このパラメータは、リビジョンバージョン 8.0.1.1.19 の PolarDB for MySQL 8.0.1 でのみサポートされています。 |
スレッドプールのステータスをクエリする
次のステートメントを実行して、スレッドプールのステータスをクエリできます。
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 |
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
(以下、出力例のため省略)
次の表に、パラメータを示します。
パラメータ | 説明 |
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 システムのパフォーマンス