tencent cloud

TDSQL-C for MySQL

動的スレッドプール

Download
フォーカスモード
フォントサイズ
最終更新日: 2025-12-30 16:14:39

機能説明

TDSQL-C for MySQLは、コンピュートとストレージの分離設計思想を採用し、パブリッククラウド環境におけるビジネス成長に応じたクラスタの弾力的な拡張という必須要件を満たします。データベースのコンピュートノード(Database Engine Server)はメタデータのみを保存し、データファイルやRedo Logなどはリモートのストレージノード(Database Storage Server)に保存されます。各コンピュートノード間ではRedo Log関連のメタデータ情報の同期のみで済むため、プライマリノードとリードレプリカノード間のレプリケーション遅延が大幅に低減されます。さらに、プライマリノードに障害が発生した場合、迅速に新しいノードを起動してシームレスな置換を実現します。 スレッドプール(Thread_pool)は一定数のワーカースレッドで接続リクエストを処理するため、OLTPワークロードのシナリオに適しています。ただし、スロークエリ傾向のリクエストでは、ワーカースレッドが高遅延操作でブロックされ、新規リクエストへの応答が遅延し、従来のone-thread-per-connection(Per_thread)モードよりもシステムスループットが低下する課題があります。 Per_threadモードとThread_poolモードにはそれぞれ長所短所があり、システムは業務タイプに応じて柔軟に切り替える必要があります。残念ながら、現在の両モードの切り替えにはサーバーの再起動が必須です。通常、モード切り替え需要は業務ピーク時に発生するため、強制再起動は業務に深刻な影響を与えます。 Per_threadモードとThread_poolモードの柔軟な切り替えを実現するため、TDSQL-C for MySQLはスレッドプール動的切り替え機能を最適化しました。つまり、データベースサービスを再起動せずにスレッドプールを動的に有効化または無効化できます。

サポートバージョン

カーネルバージョン TDSQL-C for MySQL 5.7 2.0.23/2.1.9 以降。
カーネルバージョンはTDSQL-C for MySQL 8.0の3.1.10以上です。

適用シーン

性能が重視され、業務タイプに応じてデータベースの動作モードを柔軟に調整する必要があるビジネス。

性能影響

パラメータ thread_handling の設定により、サーバーが接続スレッドに使用するスレッド処理モデルを切り替えることができます。このパラメータの値を pool-of-threads から one-thread-per-connection に切り替えるプロセス自体は、クエリの蓄積や性能への影響をもたらしません。
パラメータ thread_handling の設定により、サーバーが接続スレッドに使用するスレッド処理モデルを切り替えることができます。このパラメータの値を one-thread-per-connection から pool-of-threads に切り替えるプロセスでは、以前スレッドプールが休止状態になっているため、QPSが極めて高く持続的な高負荷がかかっている場合、一定のリクエスト蓄積が存在する可能性があります。解決策は以下の通りです:
ソリューション1:thread_pool_oversubscribeを適切に増加し、thread_pool_stall_limitを適切に減少させることで、スレッドプールを迅速に活性化します。蓄積されたSQLが処理された後、状況に応じて上記の変更を元に戻します。
ソリューション2:SQLの蓄積が発生した場合、数秒間業務トラフィックを一時停止または低減し、pool-of-threadsの活性化が完了するのを待ってから、持続的な高負荷業務トラフィックを再開します。

使用説明

thread_handling_switch_mode を追加し、スレッドプール動的切り替え機能を制御するために使用されます。選択可能な値とその意味は以下の通りです:
選択可能な値
意味
disabled
モードの動的切り替えを禁止する
stable
新規接続のみ移行
fast
新規接続と新規リクエストの両方を移行、デフォルトモード
sharp
アクティブな接続を強制終了し、ユーザーに再接続を促すことで、迅速な切り替えを実現します。
show threadpool statusに以下の状態を追加しました:
connections_moved_from_per_thread は、Per_thread から Thread_pool へ移行した接続数を表します。
connections_moved_to_per_thread は、Thread_pool から Per_thread へ移行した接続数を表します。
events_consumed は各スレッドプールワーカースレッドグループが消費したイベントの総数を示します。Thread_pool から Per_thread へ移行後、イベント総数は増加しなくなります。
average_wait_usecs_in_queue は各イベントがキュー内で平均的に待機した時間を示します。
show full processlistに以下の状態を追加しました:
Moved_to_per_thread は当該接続が Per_thread へ移行した回数を表します。
Moved_to_thread_pool は当該接続が Thread_pool へ移行した回数を表します。

パラメータ説明

スレッドプール関連パラメータの紹介:
パラメータ名
動的
タイプ
デフォルト
パラメータ値の範囲
説明
thread_pool_idle_timeout
Yes
uint
60
[1, UINT_MAX]
ワーカースレッドは、処理すべきネットワークイベントがない場合、最大でこの時間(秒単位)待機した後に破棄されます。
thread_pool_oversubscribe
Yes
uint
3
[1,1000]
1つのワーキンググループで許可される最大worker数
thread_pool_size
Yes
uint
現在のマシンのCPU数
[1,1000]
スレッドグループの数
thread_pool_stall_limit
Yes
uint
500
[10, UINT_MAX]
この時間間隔(単位:ミリ秒)ごとに、タイマースレッドがすべてのスレッドグループを巡回してチェックします。
スレッドグループにリスナーが存在せず、高優先度キューと低優先度キューが空でなく、新規のIOネットワークイベントが発生していない場合、当該スレッドグループはステール状態にあると判断されます。タイマースレッドは、当該スレッドグループの負荷を軽減するため、新しいワーカースレッドを起動または作成します。
thread_pool_max_threads
Yes
uint
100000
[1,100000]
スレッドプール内の全ワーカースレッドの総数
thread_pool_high_prio_mode
Yes, session
enum
transactions
transactions\\statement\\none
高優先度キューの動作モードは、以下の3種類を含む:
transactions:トランザクションが開始されたSQLが1つだけ存在し、かつthread_pool_high_prio_ticketsが0でない場合に限り、高優先度キューに入ります。各接続は、thread_pool_high_prio_ticketsのチケットが優先キューに割り当てられた後、通常キューに移動します。
statement:すべての接続が高優先度キューに配置されます。
none:statementとは反対に、すべての接続が低優先度キューに配置されます。
thread_pool_high_prio_tickets
Yes, session
uint
UINT_MAX
[0, UINT_MAX]
トランザクション動作モードにおいて、各接続に付与されるチケットのサイズ
threadpool_workaround_epoll_bug
Yes
bool
false
true/false
linux2.xにおけるepollのバグを回避するかどうか。このバグはlinux3で修正されています。
show threadpool statusコマンドで表示される関連ステータスの説明:
ステータス名
説明
groupid
スレッドグループID
connection_count
スレッドグループのユーザー接続数
thread_count
スレッドグループ内のワーカースレッド数
havelistener
スレッドグループに現在リスナーが存在するかどうか
active_thread_count
スレッドグループ内のアクティブなワーカー数
waiting_thread_count
スレッドグループ内の待機中ワーカー数(wait_begin を呼び出したワーカー)
waiting_threads_size
スレッドグループ内で処理すべきネットワークイベントがなく、休止状態に入り喚起を待機しているワーカー数(thread_pool_idle_timeout秒後に自動的に破棄されます)
queue_size
スレッドグループの通常優先度キュー長
high_prio_queue_size
スレッドグループの高優先度キューの長さ
get_high_prio_queue_num
スレッドグループ内の高優先度キューからイベントが取り出された総回数
get_normal_queue_num
スレッドグループ内の通常優先度キューからイベントが取り出された総回数
create_thread_num
スレッドグループ内に作成されたworkerスレッドの総数
wake_thread_num
スレッドグループ内のwaiting_threadsキューから喚起されたワーカーの総数
oversubscribed_num
スレッドグループ内のワーカーが現在のスレッドグループがオーバーサブスクライブド状態であることを検出し、休止状態に入る準備をした回数
mysql_cond_timedwait_num
スレッドグループ内のワーカーがwaiting_threadsキューに入隊した総回数
check_stall_nolistener
スレッドグループがタイマースレッドのcheck_stallチェックでリスナー不在を検出した総回数
check_stall_stall
スレッドグループがタイマースレッドのcheck_stallチェックでストール状態と判定された総回数
max_req_latency_us
スレッドグループ内のユーザー接続がキューで待機する最長時間(単位:マイクロ秒)
conns_timeout_killed
スレッドグループ内のユーザー接続がクライアントからの新規メッセージなし時間の閾値(net_wait_timeout)超過によりキルされた総回数
connections_moved_in
他のスレッドグループから当該スレッドグループに移行した接続の総数
connections_moved_out
当該スレッドグループから他のスレッドグループに移行した接続の総数
connections_moved_from_per_thread
スレッドグループにone-thread-per-connectionモードから移行した接続の総数
connections_moved_to_per_thread
当該スレッドグループからone-thread-per-connectionモードに移行した接続の総数
events_consumed
スレッドグループが処理したイベントの総数
average_wait_usecs_in_queue
スレッドグループ内の全イベントがキューで待機する平均待機時間

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック