PolarDB for MySQLは、データベースのパフォーマンスとリソース使用率を最適化するためのスレッドプール機能を提供します。 この機能は、スレッドをセッションから切り離します。 この機能は、セッションごとに1つのスレッドではなく、スレッドのプールを使用して、アクティブなセッション全体でタスクを実行します。
メリット
従来のMySQLアーキテクチャでは、セッションごとにスレッドが作成され維持されます。 多数のセッションが存在する場合、高いリソース競合、過剰なスレッドスケジューリング、およびキャッシュ無効化が発生する可能性があり、これはクラスタ性能を著しく低下させる。
PolarDBのスレッドプールでは、さまざまな種類のSQL操作に異なる優先度を持たせ、同時実行制御を実装し、接続数を最適な数に制限します。 これにより、PolarDBクラスターは、接続の同時実行性が高い場合でも高いパフォーマンスを維持できます。 スレッドプール機能には、次の利点があります。
多数のスレッドが同時に実行されると、スレッドプールは妥当な範囲内で同時スレッドの数を自動的に調整します。 これにより、過剰なスレッドスケジューリングを回避し、キャッシュ無効化のリスクを軽減できます。
多数のタスクが同時に実行される場合、スレッドプールは、ステートメントとトランザクションを個別に優先順位付けおよび管理し、ステートメントとトランザクションの同時実行数を制御します。これにより、リソースの競合が緩和され、システムのパフォーマンスが最適化されます。
スレッドプールは、管理関連のSQL文に高い優先度を付与します。 これにより、システム負荷が高い場合でも、接続確立、データベース管理、データベース監視などの操作を確実に実行できます。
スレッドプールは、複雑なSQL文に低い優先度を付与し、これらの文の最大通貨を制限します。 これにより、複雑なクエリによるシステムリソースの過剰な消費が防止され、データベースシステム全体が動作し続けることが保証される。
スレッドプールの使用方法
次の表に示すパラメーターを使用して、PolarDBコンソールでスレッドプール機能を設定できます。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。
パラメーター | 説明 |
loose_thread_pool_enabled | スレッドプール機能を有効にするかどうかを指定します。 有効な値:
既定値:OFF 説明 スレッドプール機能を有効または無効にした後、クラスターを再起動する必要はありません。 |
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 デフォルト値は 10 です。 |
loose_thread_pool_stall_limit | スレッドプールが輻輳状態になるまでのタイムアウトしきい値。 スレッドプールが輻輳状態になると、システムはSQL文を実行するための新しいスレッドを作成します。 有効な値: 1 ~ 18446744073709551615 既定値:5 単位:ミリ秒。 説明 データベースエンジンがMySQL 5.6のクラスターの場合、デフォルト値は30ミリ秒です。 |
loose_bypass_thread_pool_ips | スレッドプールによって課された制限を回避できるクライアントIPアドレス。 これらのIPアドレスを持つクライアントは、スレッドプールが完全に占有されていても、管理SQL文を実行できます。 例:
説明 このパラメーターは、PolarDB for MySQL 8.0.1.1.19以降のクラスターでのみサポートされます。 |
loose_bypass_thread_pool_check_ignore_proxy | これらのIPアドレスを持つクライアントがProxy経由でデータベースに接続するときに、
デフォルト値: ON。 説明 このパラメーターは、PolarDB for MySQL 8.0.1.1.19以降のクラスターでのみサポートされます。 |
loose_thread_pool_high_priority_users | 優先度の高いデータベースアカウント。 これらのアカウントからのリクエストは、スレッドプールの高優先度キューに配置され、最初に処理されます。 例:
説明
|
loose_thread_pool_mark_ddl_thread_timeout_sec | スレッドプールでのDDL操作のタイムアウトしきい値。 しきい値に達すると、DDL操作はタイムアウトとラベル付けされ、システムは操作を実行するための新しいスレッドを自動的に作成します。 有効な値: 0 ~ 864000 既定値:600。 単位は秒です。 説明 このパラメーターは、PolarDB for MySQL 8.0.1.1.19以降のクラスターでのみサポートされます。 |
loose_thread_pool_mark_ddl_thread_timeout_immediately | スレッドプールの負荷が高く、優先度の低いキューが積み上げられている場合に、DDLステートメントにタイムアウトとしてすぐにラベルを付け、ステートメントを処理する新しいスレッドを作成するかどうかを指定します。 このパラメーターは、多数のDDLステートメントを実行する必要があるシナリオに適用できます。 有効な値:
既定値:OFF 説明 このパラメーターは、PolarDB for MySQL 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テスト
このセクションでは、スレッドプール機能が有効と無効の場合のデータベースのパフォーマンスを比較します。 テスト結果は、スレッドプール機能が有効になっている場合、同時実行性の高い条件下でデータベースのパフォーマンスが大幅に向上することを示しています。