PolarDBは、PolarDB for MySQLのパフォーマンスを最大化するためのスレッドプール機能を提供します。 この機能により、スレッドとセッションが分離されます。これにより、セッションはスレッドを共有し、より少ないスレッドでより多くのタスクを完了できます。
メリット
デフォルトでは、各セッションはMySQLに専用スレッドを作成します。 多数のアクティブなセッションがリソースを求めて競合し、クラスターのパフォーマンスが低下します。 多数のスレッドのスケジューリングとキャッシュの無効化も、クラスタのパフォーマンスを低下させる可能性があります。
PolarDBのスレッドプールは、SQL文に異なる優先順位を付与し、同時実行メカニズムで構成されます。 PolarDBデータベースは、接続数を制限することで、大規模な接続と高い同時実行性の場合に高いパフォーマンスを保証できます。 スレッドプールには次の利点があります。
- 多数の同時スレッドが実行されている場合、スレッドプールは自動的に同時スレッドの数を適切な範囲に制限します。 これにより、スレッドスケジューリングの作業負荷が軽減され、キャッシュの無効化が回避されます。
- 多数のトランザクションが同時に実行されると、スレッドプールはSQL文とトランザクションに異なる優先順位を自動的に付与します。 また、同時ステートメントとトランザクションの数を個別に制限し、リソースの競合を軽減します。
- スレッドプールは、データベースの管理に使用されるSQLステートメントに高い優先順位を付与します。 これにより、負荷の高いシナリオで、接続の確立、データベース管理、データベースの監視などの操作を期待どおりに実行できます。
- スレッドプールは、複雑なSQLステートメントに低い優先度を付与し、同時ステートメントの最大数を制限します。 これにより、多数の複雑なSQL文がシステムリソースを使い果たしてデータベースサービスが利用可能になるのを防ぎます。
スレッドプールの使用方法
PolarDBコンソールで、スレッドプールの次のパラメーターを指定できます。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。
パラメーター | 説明 |
loose_thread_pool_enabled | スレッドプール機能を有効にするかどうかを指定します。 有効な値:
既定値:OFF 説明 スレッドプール機能を有効または無効にした後、インスタンスを再起動する必要はありません。 |
loose_thread_pool_high_prio_mode | スレッドプールの優先度の高いキューモード。 有効な値:
デフォルト値: 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 単位は秒です。 デフォルト値: 0。 説明 このパラメーターは、PolarDB for MySQLの5.6および5.7クラスターでのみ有効です。 |
loose_thread_pool_oversubscribe | 各スレッドグループでサポートされているアクティブなスレッドの数。 アクティブなスレッドは、SQL文を実行しているスレッドです。 スレッドが実行しているステートメントが次のステータスの場合、スレッドはアクティブではありません。
有効な値: 1 ~ 1000 デフォルト値は 10 です。 |
loose_thread_pool_stall_limit | スレッドプールが輻輳しているかどうかを判断するための時間しきい値。 スレッドプールが輻輳している場合、システムはSQL文を実行するための新しいスレッドを作成します。 有効な値: 1 ~ 18446744073709551615 単位:ミリ秒。 デフォルト値:30 説明 このパラメーターは、PolarDB for MySQLの5.6および5.7クラスターでのみ有効です。 |
loose_bypass_thread_pool_ips | スレッドプールによってブロックされていないクライアントIPアドレス。 スレッドプールがいっぱいであっても、SQL文を実行してデータベースを管理できます。 例:
説明 このパラメーターは、PolarDB for MySQL 8.0.1.1.19以降のクラスターでのみ有効です。 |
loose_bypass_thread_pool_check_ignore_proxy | loose_bypass_thread_pool_ips パラメーターを使用して、PolarProxy経由でデータベースに接続されているクライアントのIPアドレスを無視するかどうかを指定します。 有効な値:
デフォルト値: 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 | 0 | 1 | 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 | 0 | 1 | 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行 (0.00秒)
下表に、各パラメーターを説明します。
パラメーター | 説明 |
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を使用してベンチマークを実行する
次の図は、スレッドプールが有効なシナリオとスレッドプールが無効なシナリオのデータベースパフォーマンスを比較しています。 スレッドプールは、同時実行性の高いシナリオでデータベースのパフォーマンスを向上させるのに役立ちます。
![OLTP without index updates](https://help-static-aliyun-doc.aliyuncs.com/assets/img/ja-JP/1316847171/p99066.png)
![OLTP write-only](https://help-static-aliyun-doc.aliyuncs.com/assets/img/ja-JP/1316847171/p99067.png)
![OLTP read-only](https://help-static-aliyun-doc.aliyuncs.com/assets/img/ja-JP/1316847171/p99068.png)
![OLTP read and write](https://help-static-aliyun-doc.aliyuncs.com/assets/img/ja-JP/1316847171/p99069.png)