PolarDB for MySQL のパフォーマンスを最適化するために、PolarDB はスレッドプール機能を提供します。この機能は、スレッドをセッションから切り離します。セッションごとに 1 つのスレッドを割り当てる代わりに、この機能はスレッドのプールを使用して、アクティブなセッション全体でタスクを実行します。
メリット
デフォルトでは、MySQL はスレッドにセッション排他モードを使用します。このモードでは、各セッションが排他的なスレッドを作成します。多くのセッションが存在すると、深刻なリソース競合が発生し、パフォーマンスが低下します。大量のスレッドスケジューリングとキャッシュの無効化も、パフォーマンスの急激な低下を引き起こします。
PolarDB スレッドプールは、さまざまな種類の SQL 操作に対して優先度および同時実行制御メカニズムを実装し、接続数を最適な数に近づけます。これにより、PolarDB データベースは、高接続および高い同時実行性の条件下で高いパフォーマンスを維持できます。スレッドプールのメリットは次のとおりです。
多くのスレッドが同時に実行されると、スレッドプールは同時実行スレッドの数を自動的に最適な範囲に調整します。これにより、過度のスレッドスケジューリングと頻繁なキャッシュの無効化を回避できます。
多くのトランザクションが同時に実行されると、スレッドプールは文とトランザクションに異なる優先度を割り当てます。文とトランザクションの同時実行性を個別に制御して、リソース競合を減らします。
スレッドプールは、管理関連の SQL 文に高い優先度を割り当て、これらの文が最初に実行されるようにします。これにより、システム負荷が高い場合でも、新しい接続の作成、管理、モニタリングなどの操作が安定して実行されることが保証されます。
スレッドプールは、複雑な 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 文を実行しているスレッドのことですが、次の 2 つの状況のスレッドは含まれません。
値の範囲: 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 以降の MySQL 8.0.1。 |
loose_bypass_thread_pool_check_ignore_proxy |
説明 適用バージョン: リビジョンバージョンが 8.0.1.1.19 以降の 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 以降の MySQL 8.0.1。 |
loose_thread_pool_mark_ddl_thread_timeout_immediately | スレッドプールの負荷が高く、低優先度キューが積み上げられている場合に、DDL スレッドをすぐにタイムアウトとしてマークするかどうかを指定します。DDL スレッドがタイムアウトとしてマークされると、システムはリクエストを処理するために新しいスレッドを作成します。このパラメーターは、頻繁なバッチ DDL 操作を必要とするビジネスシナリオに適しています。有効値:
説明 適用バージョン: リビジョンバージョンが 8.0.1.1.19 以降の 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 読み取り/書き込みテスト