すべてのプロダクト
Search
ドキュメントセンター

PolarDB:スレッドプール

最終更新日:Jun 04, 2024

PolarDBは、PolarDB for MySQLのパフォーマンスを最大化するためのスレッドプール機能を提供します。 この機能により、スレッドとセッションが分離されます。これにより、セッションはスレッドを共有し、より少ないスレッドでより多くのタスクを完了できます。

メリット

デフォルトでは、各セッションはMySQLに専用スレッドを作成します。 多数のアクティブなセッションがリソースを求めて競合し、クラスターのパフォーマンスが低下します。 多数のスレッドのスケジューリングとキャッシュの無効化も、クラスタのパフォーマンスを低下させる可能性があります。

PolarDBのスレッドプールは、SQL文に異なる優先順位を付与し、同時実行メカニズムで構成されます。 PolarDBデータベースは、接続数を制限することで、大規模な接続と高い同時実行性の場合に高いパフォーマンスを保証できます。 スレッドプールには次の利点があります。

  • 多数の同時スレッドが実行されている場合、スレッドプールは自動的に同時スレッドの数を適切な範囲に制限します。 これにより、スレッドスケジューリングの作業負荷が軽減され、キャッシュの無効化が回避されます。
  • 多数のトランザクションが同時に実行されると、スレッドプールはSQL文とトランザクションに異なる優先順位を自動的に付与します。 また、同時ステートメントとトランザクションの数を個別に制限し、リソースの競合を軽減します。
  • スレッドプールは、データベースの管理に使用されるSQLステートメントに高い優先順位を付与します。 これにより、負荷の高いシナリオで、接続の確立、データベース管理、データベースの監視などの操作を期待どおりに実行できます。
  • スレッドプールは、複雑なSQLステートメントに低い優先度を付与し、同時ステートメントの最大数を制限します。 これにより、多数の複雑なSQL文がシステムリソースを使い果たしてデータベースサービスが利用可能になるのを防ぎます。

スレッドプールの使用方法

PolarDBコンソールで、スレッドプールの次のパラメーターを指定できます。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。

パラメーター説明
loose_thread_pool_enabledスレッドプール機能を有効にするかどうかを指定します。 有効な値:
  • ON
  • オフ

既定値:OFF

説明 スレッドプール機能を有効または無効にした後、インスタンスを再起動する必要はありません。
loose_thread_pool_high_prio_modeスレッドプールの優先度の高いキューモード。 有効な値:
  • トランザクション: トランザクションで許可されているSQL文は、優先度の高いキューに追加され、チケットが与えられます。 チケットの数は、thread_pool_high_prio_ticketsパラメーターの値と同じです。 SQL文は、すべてのチケットがなくなるまでキューに入れられます。
  • ステートメント: すべてのSQLステートメントは、優先度の高いキューに追加されます。
  • none: すべての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

単位は秒です。 デフォルト値: 0。

説明 このパラメーターは、PolarDB for MySQLの5.6および5.7クラスターでのみ有効です。
loose_thread_pool_oversubscribe各スレッドグループでサポートされているアクティブなスレッドの数。

アクティブなスレッドは、SQL文を実行しているスレッドです。 スレッドが実行しているステートメントが次のステータスの場合、スレッドはアクティブではありません。

  • SQL文は、ディスク入出力 (I/O) に対して保留中です。
  • 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文を実行してデータベースを管理できます。
例:
10.69.96.16,10.69.96.17
説明 このパラメーターは、PolarDB for MySQL 8.0.1.1.19以降のクラスターでのみ有効です。
loose_bypass_thread_pool_check_ignore_proxyloose_bypass_thread_pool_ipsパラメーターを使用して、PolarProxy経由でデータベースに接続されているクライアントのIPアドレスを無視するかどうかを指定します。 有効な値:
  • ON: PolarProxyを介してデータベースに接続されているクライアントのIPアドレスが、loose_bypass_thread_pool_ipsパラメーターで設定されていても、スレッドプールによってブロックされることを示します。
  • OFF: PolarProxyを介してデータベースに接続されているクライアントのIPアドレスが、loose_bypass_thread_pool_ipsパラメーターで設定されている場合、スレッドプールによってブロックされないことを示します。

デフォルト値: ON。

説明 このパラメーターは、PolarDB for MySQL 8.0.1.1.19以降のクラスターでのみ有効です。
loose_thread_pool_high_priority_users優先度の高いデータベースアカウント。 このパラメーターを設定すると、これらのアカウントからのリクエストはスレッドプールの優先度の高いキューに配置され、最初に処理されます。
例:
user1, user2
説明
  • このパラメーターは、PolarDB for MySQL 8.0.1.1.19以降のクラスターでのみ有効です。
  • このパラメーターを設定すると、新しいデータベース接続に対してのみ有効になります。
  • 優先度の高いアカウントを設定しすぎないことをお勧めします。
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ステートメントが実行されるシナリオに適用できます。 有効な値:
  • ON
  • オフ

既定値: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を使用してベンチマークを実行する

次の図は、スレッドプールが有効なシナリオとスレッドプールが無効なシナリオのデータベースパフォーマンスを比較しています。 スレッドプールは、同時実行性の高いシナリオでデータベースのパフォーマンスを向上させるのに役立ちます。

図1. OLTP without index updatesOnline transaction processing (OLTP) without index updates
図2. OLTP書き込み専用 OLTP write-only
図3. OLTP読み取り専用 OLTP read-only
図4. OLTP読み書き OLTP read and write