3.7.1 スレッドプール
(1) Orchestrator
Mediatorへの送信時(トランザクション決着要求・仕掛中トランザクションのキャンセル要求)の同時実行スレッド数を制御します。同時実行スレッド数はOrchestratorのパラメタ「mediator.termination-thread-pool-size」で指定します。同時実行スレッド数を超えた要求がある場合は、キューに保持します。
|
|
1トランザクションが終了した際に、トランザクションに参加したMediatorの数だけスレッドを使用します。また、スレッドはMediatorへ送信してから応答を受信するまで占有します。
|
|
(a) 設計指針
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数×トランザクションに参加するMediatorの台数分スレッドが必要です。
ただし、トランザクションの終了が重ならないかぎりは、トランザクションの同時実行数×トランザクションに参加するMediatorの台数分のスレッドは必要ありません。
スレッドの占有期間に相当するMediatorからの応答時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するMediatorの台数の2倍未満になった場合は、トランザクションに参加するMediatorの台数を2倍したスレッド数としてください。
Orchestrator1台当たりの目標TPSを基準にした算出方法を次に示します。
- X = A × B × C
-
X:スレッド数
A:目標TPS
B:トランザクションに参加するMediator台数
C:Mediatorからの応答時間(秒)
例)
- 目標40TPS、トランザクションに参加するMediator5台、Mediatorからの応答時間0.1秒とした場合、必要なスレッド数は20となります。
-
X = 40 × 5 × 0.1
X = 20
- 安全率を1.5とした場合、必要なスレッド数は30となります。
-
X = 20 × 1.5
X = 30
(b) チューニング対象のパラメタ一覧
|
項番 |
パラメタ |
説明 |
|---|---|---|
|
1 |
mediator.termination-thread-pool-size |
OrchestratorからMediatorへの送信に使用するスレッド数を指定します。 詳細は「7.2.2 Orchestrator」を参照してください。 |
(c) チューニング方法
mediator.termination-thread-pool-size
このパラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「9.4.3 メトリクス」を参照してください。
PrometheusのWeb UIで「executor_active_threads{job="orchestrator-scraper"}」のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
|
|
長い期間このパラメタで指定した値で推移している場合、スレッド不足によってMediatorへの送信待ちが発生しているおそれがあります。このパラメタの値を増やすことで、次の図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間。
|
|
また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。JaegerのWeb UIで確認したいトレース情報のTrace Pageを表示し、次のオペレーション名のspanを表示します。
「Sent.hmppcto.mediator.TerminationReceiverService.commit」「Sent:hmppcto.mediator.TerminationReceiverService.rollback」
上記spanのStart Timeが次のspanのLogs「end AP」と差が大きい場合、このパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
オペレーション名「Recv:j.c.H.s.h.i.TxInterceptor:innerIntercept」
分散トレースの確認方法の詳細については、「9.4.2 分散トレース」を参照してください。
スレッドが空き待ちになっている状態の参考データを下図に示します。
|
|
(2) Entity-Service
HMP-PCTOが制御するスレッドは存在しないため、HMP-PCTOのスレッドに関するパラメタのチューニングは必要ありません。
(3) SQL-Participant
SQL-Participantでは次に示す3つのスレッドプールがあります。
-
SQL-Participantのトランザクション処理に使用するスレッドプール
-
Mediatorへ送信を行うプロセスの管理に使用するスレッドプール
-
gRPC通信制御に使用するスレッドプール
図3‒6 SQL-Participantの同時実行スレッド数制御
それぞれのスレッドプールについて以降に説明します。
SQL-Participantのトランザクション処理に使用するスレッドプールでは、Entity-ServiceからのPrepare指示/トランザクションのキャンセル指示・投票処理・分散合意処理・トランザクション完了通知処理の同時実行スレッド数を制御します。同時実行スレッド数はSQL-Participantのパラメタ「sql.participant-processing.thread-pool-size」で指定します。キュー数はSQL-Participantのパラメタ「sql.participant-processing.queue-size」で指定します。
このスレッドプールで使用するスレッドとその占有期間は次のとおりです。
-
Entity-Serviceと通信を行う際、SQL実行/Prepare指示/トランザクションのキャンセル指示を受けた数分スレッドを使用します。SQL実行の場合のスレッドはSQL実行を開始してから終了するまで占有します。Prepare指示/トランザクションのキャンセル指示の場合のスレッドは投票処理の開始まで占有します。…1
-
1トランザクション内で、投票処理の際に、1スレッドを使用します。スレッドは投票処理を開始してから終了するまで占有します。…2
-
8でスレッドを生成した際に、トランザクション処理または分散合意処理で1スレッドを使用します。スレッドはトランザクション処理または分散合意処理が開始してから終了するまで占有します。…3
-
1つの分散合意処理のスレッドで、分散合意結果通知で1スレッドを使用します。スレッドは分散合意結果通知を開始してから終了するまで占有します。…4
-
1トランザクション内で、トランザクション完了通知の際に、1スレッドを使用します。スレッドはトランザクション完了通知を開始してから終了するまで占有します。なお、前述の分散合意結果通知で使用するスレッドの占有期間と、トランザクション完了通知で使用するスレッドの占有期間は、期間が重複することがあります。…5
Mediatorへ送信を行うプロセスの管理に使用するスレッドプールでは、gRPC通信制御に使用するスレッドを生成する処理の同時実行スレッド数を制御します。同時実行スレッド数はSQL-Participantのパラメタ「mediator-process-management.thread-pool-size」で指定します。
このスレッドプールで使用するスレッドとその占有期間は次のとおりです。
-
Mediatorとの通信を行うプロセス(投票処理、トランザクション完了通知、分散合意結果通知)が発生した際、トランザクションに参加したMediator数分スレッドを使用します。6のスレッドの生成を開始してから終了するまで占有します。…6
gRPC通信制御に使用するスレッドプールでは、ParticipantがMediatorと送受信を行う処理の同時実行スレッド数を制御します。同時実行スレッド数はSQL-Participantのパラメタ「mediator-communication.thread-pool-size」で指定します。キュー数はSQL-Participantのパラメタ「mediator-communication.queue-size」で指定します。
このスレッドプールで使用するスレッドとその占有期間は次のとおりです。
-
Mediatorと通信を行う際、トランザクションに参加したMediator数分スレッドを使用します。Mediatorへの通信の送信処理が完了するまで占有します。…7
-
MediatorからのgRPC通信を受信した際、1スレッド使用します。3のスレッドの生成を開始してから終了するまで占有します。…8
図3‒7 SQL-Participantのスレッド占有期間
(a) 設計指針
■SQL-Participantのトランザクション処理に使用するスレッドプール
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数分スレッドが必要です。
ただし、トランザクションの終了が重ならないかぎりは、トランザクションの同時実行数数分のスレッドは必要ありません。
スレッドの占有期間に相当する処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
SQL-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
- X = A × B
-
X:スレッド数
A:目標TPS
B:処理時間(秒)
例)
- 目標40TPS、処理時間を0.1秒とした場合、必要なスレッド数は4となります。
-
X = 40 × 0.1
X = 4
- 安全率を1.5とした場合、必要なスレッド数は6となります。
-
X = 4 × 1.5
X = 6
■SQL-Participantのトランザクション処理に使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
SQL-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B
-
Y:キュー数
A:目標TPS
B:係数
例)
目標40TPS、係数を0.25とした場合、必要なキューサイズは10となります。
Y = 40 × 0.25
Y = 10
■Mediatorへ送信を行うプロセスの管理に使用するスレッドプール
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数×トランザクションに参加するMediatorの台数分スレッドが必要です。
ただし、トランザクションの終了が重ならないかぎりは、トランザクションの同時実行数×トランザクションに参加するMediatorの台数分のスレッドは必要ありません。
スレッドの占有期間に相当する処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するMediatorの台数の2倍未満になった場合は、トランザクションに参加するMediatorの台数を2倍したスレッド数としてください。
SQL-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
- X = A × B × C × 2※
-
X:スレッド数
A:目標TPS
B:トランザクションに参加するMediator台数
C:処理時間(秒)
- 注※
-
分散合意結果通知とトランザクション完了通知は同時に実行される可能性があるため、2倍します。
例)
- 目標40TPS、トランザクションに参加するMediator5台、処理時間0.1秒とした場合、必要なスレッド数は40となります。
-
X = 40 × 5 × 0.1 × 2
X = 40
- 安全率を1.5とした場合、必要なスレッド数は60となります。
-
X = 40 × 1.5
X = 60
■gRPC通信制御に使用するスレッドプール
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数×トランザクションに参加するMediatorの台数分スレッドが必要です。
ただし、トランザクションの終了が重ならないかぎりは、トランザクションの同時実行数×トランザクションに参加するMediatorの台数分のスレッドは必要ありません。
スレッドの占有期間に相当する処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するMediatorの台数の2倍未満になった場合は、トランザクションに参加するMediatorの台数を2倍したスレッド数としてください。
SQL-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
- X = A × B × C × 2※
-
X:スレッド数
A:目標TPS
B:トランザクションに参加するMediator台数
C: 処理時間(秒)
- 注※
-
分散合意結果通知とトランザクション完了通知は同時に実行される可能性があるため、2倍します。
例)
- 目標40TPS、トランザクションに参加するMediator5台、処理時間0.1秒とした場合、必要なスレッド数は40となります。
-
X = 40 × 5 × 0.1 × 2
X = 40
- 安全率を1.5とした場合、必要なスレッド数は60となります。
-
X = 40 × 1.5
X = 60
■gRPC通信制御に使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
SQL-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B × 2※
-
Y:キュー数
A:目標TPS
B:係数
- 注※
-
分散合意結果通知とトランザクション完了通知は同時に実行される可能性があるため、2倍します。
例)
- 目標40TPS、係数を0.25とした場合、必要なキューサイズは20となります。
-
Y = 40 × 0.25 × 2
Y = 20
(b) チューニング対象のパラメタ一覧
|
項番 |
パラメタ |
説明 |
|---|---|---|
|
1 |
sql.participant-processing.thread-pool-size |
SQL-Participantがトランザクション処理で実行するスレッド数を指定します。 詳細は「7.2.4 SQL-Participant」を参照してください。 |
|
2 |
sql.participant-processing.queue-size |
SQL-Participantがトランザクション処理に使用するスレッドの割り当て待ちをするキューのサイズを指定します。 詳細は「7.2.4 SQL-Participant」を参照してください。 |
|
3 |
mediator-process-management.thread-pool-size |
Mediatorへ送信を行うプロセスを管理するスレッド数を指定します。 詳細は「7.2.4 SQL-Participant」を参照してください。 |
|
4 |
mediator-communication.thread-pool-size |
ParticipantがMediatorと送受信を行うスレッド数を指定します。 詳細は「7.2.4 SQL-Participant」を参照してください。 |
|
5 |
mediator-communication.queue-size |
ParticipantがMediatorとの送受信に使用するスレッドの割り当て待ちをするキューのサイズを指定します。 詳細は「7.2.4 SQL-Participant」を参照してください。 |
(c) チューニング方法
各パラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「9.4.3 メトリクス」を参照してください。
PrometheusのWeb UIで次に示す表のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
|
チューニング対処のパラメタ |
クエリ |
|---|---|
|
sql.participant-processing.thread-pool-size |
executor_active_threads{job=" sql-participant-scraper"} |
|
mediator-process-management.thread-pool-size |
|
|
mediator-communication.thread-pool-size |
|
|
sql.participant-processing.queue-size |
executor_queued_tasks{job=" sql-participant-scraper"} |
|
mediator-communication.queue-size |
|
|
executor_active_threads{job="sql-participant-scraper"}の結果が、長い期間sql.participant-processing.thread-pool-size、mediator-process-management.thread-pool-size、mediator-communication.thread-pool-sizeで指定した値で推移している場合、スレッド不足によって、処理の遅延が発生しているおそれがあります。これらのパラメタの値を増やすことで、次の図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間です。
|
|
また、executor_queued_tasks{job="sql-participant-scraper"}の結果が、sql.participant-processing.queue-size やmediator-communication.queue-sizeで指定した値で推移している場合、キューサイズ不足が発生しているおそれがあります。これらのパラメタの値を増やすことでキューサイズ不足を防ぐことができます。
また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。JaegerのWeb UIで確認したいトレース情報のTrace Pageを表示し、次のオペレーション名のspanを表示します。
-
sql.participant-processing.thread-pool-size
オペレーション名「j.c.H.s.h.p.s.GrpcTerminationJudgeRequestSender」
(Tagsが「internal.span.format」と「status.code」だけのspan)
オペレーション名「j.c.H.s.h.p.s.GrpcNotifyTerminationResultRequestSender」
(Tagsが「internal.span.format」と「status.code」だけのspan)
オペレーション名「j.c.H.s.h.p.c.o.TerminatedTransactionNotify:sendTransactionNotify」
(Tagsが「internal.span.format」と「status.code」だけのspan)
-
mediator-process-management.thread-pool-size
オペレーション名「j.c.H.s.h.p.s.GrpcTerminationJudgeRequestSender」
(Tagsに「branch-xid」などが含まれるspan)
オペレーション名「j.c.H.s.h.p.s.GrpcNotifyTerminationResultRequestSender」
(Tagsに「consensus-value」などが含まれるspan)
オペレーション名「j.c.H.s.h.p.c.o.TerminatedTransactionNotify:sendTransactionNotify」
(Tagsに「host-name」などが含まれるspan)
-
mediator-communication.thread-pool-size
オペレーション名「Sent.hmppcto.mediator.TerminationReceiverService.propose」
オペレーション名「Sent.hmppcto.mediator.TerminationReceiverService.notifyTerminationResult」
オペレーション名「Sent.hmppcto.mediator.TerminationReceiverService.notifyTerminatedTransaction」
上記spanのDurationが大きい場合、SQL-Participantのパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
分散トレースの確認方法の詳細については、「9.4.2 分散トレース」を参照してください。
(4) TCC-Participant
TCC-Participantでは次に示す3つのスレッドプールがあります。
-
TCC-Participantのトランザクション処理に使用するスレッドプール
-
Mediatorへ送信を行うプロセスの管理に使用するスレッドプール
-
gRPC通信制御に使用するスレッドプール
図3‒10 TCC-Participantの同時実行スレッド数制御
それぞれのスレッドプールについて以降に説明します。
TCC-Participantのトランザクション処理に使用するスレッドプールでは、投票処理・分散合意処理・トランザクション完了通知処理の同時実行スレッド数を制御します。同時実行スレッド数はTCC-Participantのパラメタ「tcc.participant-processing.thread-pool-size」で指定します。キュー数はTCC-Participantのパラメタ「tcc.participant-processing.queue-size」で指定します。
このスレッドプールで使用するスレッドとその占有期間は次のとおりです。
-
1トランザクション内で、投票処理の際に、1スレッドを使用します。スレッドは投票処理を開始してから終了するまで占有します。…1
-
7でスレッドを生成した際に、トランザクション処理または分散合意処理で1スレッドを使用します。スレッドはトランザクション処理または分散合意処理が開始してから終了するまで占有します。…2
-
1つの分散合意処理のスレッドで、分散合意結果通知で1スレッドを使用します。スレッドは分散合意結果通知を開始してから終了するまで占有します。…3
-
1トランザクション内で、トランザクション完了通知の際に、1スレッドを使用します。スレッドはトランザクション完了通知を開始してから終了するまで占有します。なお、前述の分散合意結果通知で使用するスレッドの占有期間と、トランザクション完了通知で使用するスレッドの占有期間は、期間が重複することがあります。…4
Mediatorへ送信を行うプロセスの管理に使用するスレッドプールでは、gRPC通信制御に使用するスレッドを生成する処理の同時実行スレッド数を制御します。同時実行スレッド数はTCC-Participantのパラメタ「mediator-process-management.thread-pool-size」で指定します。
このスレッドプールで使用するスレッドとその占有期間は次のとおりです。
-
Mediatorとの通信を行うプロセス(投票処理、トランザクション完了通知、分散合意結果通知)が発生した際、トランザクションに参加したMediator数分スレッドを使用します。6のスレッドの生成を開始してから終了するまで占有します。…5
gRPC通信制御に使用するスレッドプールでは、ParticipantがMediatorと送受信を行う処理の同時実行スレッド数を制御します。同時実行スレッド数はTCC-Participantのパラメタ「mediator-communication.thread-pool-size」で指定します。キュー数はTCC-Participantのパラメタ「mediator-communication.queue-size」で指定します。
このスレッドプールで使用するスレッドとその占有期間は次のとおりです。
-
Mediatorと通信を行う際、トランザクションに参加したMediator数分スレッドを使用します。Mediatorへの通信の送信処理が完了するまで占有します。…6
-
MediatorからのgRPC通信を受信した際、1スレッド使用します。2のスレッドの生成を開始してから終了するまで占有します。…7
図3‒11 TCC-Participantのスレッド占有期間
(a) 設計指針
■TCC-Participantのトランザクション処理に使用するスレッドプール
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数分スレッドが必要です。
ただし、トランザクションの終了が重ならないかぎりは、トランザクションの同時実行数数分のスレッドは必要ありません。
スレッドの占有期間に相当する処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
- X = A × B
-
X:スレッド数
A:目標TPS
B:処理時間(秒)
例)
- 目標40TPS、処理時間を0.1秒とした場合、必要なスレッド数は4となります。
-
X = 40 × 0.1
X = 4
- 安全率を1.5とした場合、必要なスレッド数は6となります。
-
X = 4 × 1.5
X = 6
■TCC-Participantのトランザクション処理に使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B
-
Y:キュー数
A:目標TPS
B:係数
例)
- 目標40TPS、係数を0.25とした場合、必要なキューサイズは10となります。
-
Y = 40 × 0.25
Y = 10
■Mediatorへ送信を行うプロセスの管理に使用するスレッドプール
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数×トランザクションに参加するMediatorの台数分スレッドが必要です。
ただし、トランザクションの終了が重ならないかぎりは、トランザクションの同時実行数×トランザクションに参加するMediatorの台数分のスレッドは必要ありません。
スレッドの占有期間に相当する処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するMediatorの台数の2倍未満になった場合は、トランザクションに参加するMediatorの台数を2倍したスレッド数としてください。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
- X = A × B × C × 2※
-
X:スレッド数
A:目標TPS
B:トランザクションに参加するMediator台数
C:処理時間(秒)
- 注※
-
分散合意結果通知とトランザクション完了通知は同時に実行される可能性があるため、2倍します。
例)
- 目標40TPS、トランザクションに参加するMediator5台、処理時間0.1秒とした場合、必要なスレッド数は40となります。
-
X = 40 × 5 × 0.1 × 2
X = 40
- 安全率を1.5とした場合、必要なスレッド数は60となります。
-
X = 40 × 1.5
X = 60
■gRPC通信制御に使用するスレッドプール
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数×トランザクションに参加するMediatorの台数分スレッドが必要です。
ただし、トランザクションの終了が重ならないかぎりは、トランザクションの同時実行数×トランザクションに参加するMediatorの台数分のスレッドは必要ありません。
スレッドの占有期間に相当する処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するMediatorの台数の2倍未満になった場合は、トランザクションに参加するMediatorの台数を2倍したスレッド数としてください。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
- X = A × B × C × 2※
-
X:スレッド数
A:目標TPS
B:トランザクションに参加するMediator台数
C: 処理時間(秒)
- 注※
-
分散合意結果通知とトランザクション完了通知は同時に実行される可能性があるため、2倍します。
例)
- 目標40TPS、トランザクションに参加するMediator5台、処理時間0.1秒とした場合、必要なスレッド数は40となります。
-
X = 40 × 5 × 0.1 × 2
X = 40
- 安全率を1.5とした場合、必要なスレッド数は60となります。
-
X = 40 × 1.5
X = 60
■gRPC通信制御に使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B × 2※
-
Y:キュー数
A:目標TPS
B:係数
- 注※
-
分散合意結果通知とトランザクション完了通知は同時に実行される可能性があるため、2倍します。
例)
- 目標40TPS、係数を0.25とした場合、必要なキューサイズは20となります。
-
Y = 40 × 0.25 × 2
Y = 20
(b) チューニング対象のパラメタ一覧
|
項番 |
パラメタ |
説明 |
|---|---|---|
|
1 |
tcc.participant-processing.thread-pool-size |
TCC-Participantがトランザクション処理で実行するスレッド数を指定します。 詳細は「7.2.5 TCC-Participant」を参照してください。 |
|
2 |
tcc.participant-processing.queue-size |
TCC-Participantがトランザクション処理に使用するスレッドの割り当てを待つキューのサイズを指定します。 詳細は「7.2.5 TCC-Participant」を参照してください。 |
|
3 |
mediator-process-management.thread-pool-size |
Mediatorへ送信を行うプロセスを管理するスレッド数を指定します。 詳細は「7.2.5 TCC-Participant」を参照してください。 |
|
4 |
mediator-communication.thread-pool-size |
ParticipantがMediatorと送受信を行うスレッド数を指定します。 詳細は「7.2.5 TCC-Participant」を参照してください。 |
|
5 |
mediator-communication.queue-size |
ParticipantがMediatorとの送受信に使用するスレッドの割り当てを待つキューのサイズを指定します。 詳細は「7.2.5 TCC-Participant」を参照してください。 |
(c) チューニング方法
各パラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「9.4.3 メトリクス」を参照してください。
PrometheusのWeb UIで次に示す表のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
|
チューニング対処のパラメタ |
クエリ |
|---|---|
|
tcc.participant-processing.thread-pool-size |
executor_active_threads{job=" tcc-participant-scraper"} |
|
mediator-process-management.thread-pool-size |
|
|
mediator-communication.thread-pool-size |
|
|
tcc.participant-processing.queue-size |
executor_queued_tasks{job=" tcc-participant-scraper"} |
|
mediator-communication.queue-size |
|
|
executor_active_threads{job=" tcc-participant-scraper"}の結果が、長い期間tcc.participant-processing.thread-pool-size、mediator-process-management.thread-pool-size、mediator-communication.thread-pool-sizeで指定した値で推移している場合、スレッド不足によって、処理の遅延が発生しているおそれがあります。これらのパラメタの値を増やすことで、次の図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間です。
|
|
また、executor_queued_tasks{job=" tcc-participant-scraper"}の結果が、tcc.participant-processing.queue-size やmediator-communication.queue-sizeで指定した値で推移している場合、キューサイズ不足が発生しているおそれがあります。これらのパラメタの値を増やすことでキューサイズ不足を防ぐことができます。
また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。JaegerのWeb UIで確認したいトレース情報のTrace Pageを表示し、次のオペレーション名のspanを表示します。
-
tcc.participant-processing.thread-pool-size
オペレーション名「j.c.H.s.h.p.s.GrpcTerminationJudgeRequestSender」
(Tagsが「internal.span.format」と「status.code」だけのspan)
オペレーション名「j.c.H.s.h.p.s.GrpcNotifyTerminationResultRequestSender」
(Tagsが「internal.span.format」と「status.code」だけのspan)
オペレーション名「j.c.H.s.h.p.c.o.TerminatedTransactionNotify:sendTransactionNotify」
(Tagsが「internal.span.format」と「status.code」だけのspan)
-
mediator-process-management.thread-pool-size
オペレーション名「j.c.H.s.h.p.s.GrpcTerminationJudgeRequestSender」
(Tagsに「branch-xid」などが含まれるspan)
オペレーション名「j.c.H.s.h.p.s.GrpcNotifyTerminationResultRequestSender」
(Tagsに「consensus-value」などが含まれるspan)
オペレーション名「j.c.H.s.h.p.c.o.TerminatedTransactionNotify:sendTransactionNotify」
(Tagsに「host-name」などが含まれるspan)
-
mediator-communication.thread-pool-size
オペレーション名「Sent.hmppcto.mediator.TerminationReceiverService.propose」
オペレーション名「Sent.hmppcto.mediator.TerminationReceiverService.notifyTerminationResult」
オペレーション名「Sent.hmppcto.mediator.TerminationReceiverService.notifyTerminatedTransaction」
上記spanのDurationが大きい場合、TCC-Participantのパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
分散トレースの確認方法の詳細については、「9.4.2 分散トレース」を参照してください
(5) Mediator
Mediatorでは次に示す4つのスレッドプールがあります。
|
項番 |
Mediatorのスレッド |
説明 |
|---|---|---|
|
1 |
Mediatorの受信に使用するスレッド |
MediatorがParticipant、Orchestratorから受信する際の同時実行スレッド数を制御します。 同時実行スレッド数はMediatorのパラメタ「grpc.server.threadPoolSize」で指定します。キュー数はMediatorのパラメタ「grpc.server.queueSize」で指定します。 同時実行スレッド数を超えた要求がある場合は、キューに保持します。 トランザクションに参加したParticipantの数+1だけスレッドを使用します。また、スレッドはParticipant、Orchestratorからの受信完了まで占有します。 |
|
2 |
分散合意処理に使用するスレッド |
分散合意処理の同時実行スレッド数を制御します。 同時実行スレッド数はMediatorのパラメタ「mediator.judge.threadPoolSize」で指定します。キュー数はMediatorのパラメタ「mediator.judge.queueSize」で指定します。 同時実行スレッド数を超えた要求がある場合は、キューに保持します。 トランザクションに参加したParticipantの数だけスレッドを使用します。また、スレッドは分散合意処理を行い合意結果をConsensusLogファイルへの書き込みが完了するまで占有します。 |
|
3 |
ConsensusLogファイルへの書き込みに使用するスレッド |
ConsensusLogファイルへの書き込みの同時実行スレッド数を制御します。 同時実行スレッド数はMediatorのパラメタ「consensusLog.io.threadPoolSize」で指定します。キュー数はMediatorのパラメタ「consensusLog.io.queueSize」で指定します。 同時実行スレッド数を超えた要求がある場合は、キューに保持します。 トランザクション数だけスレッドを使用します。 スレッドは合意結果をConsensusLogファイルへ書き込みが完了するまで占有します。 |
|
4 |
Mediatorの送信に使用するスレッド |
Participantへの送信の同時実行スレッド数を制御します。 同時実行スレッド数はMediatorのパラメタ「participant.sender.threadPoolSize」で指定します。キュー数はMediatorのパラメタ「participant.sender.queueSize」で指定します。 同時実行スレッド数を超えた要求がある場合は、キューに保持します。 トランザクションに参加したParticipantの数だけスレッドを使用します。また、スレッドはParticipantへの送信完了まで占有します。 |
|
|
(a) 設計指針
■Mediatorの受信処理に使用するスレッドプール
複数のトランザクションを同時に実行する場合、極力スレッドの空き待ちを発生しないようにするためにはトランザクションの同時実行数×(トランザクションに参加するParticipantの台数+1)分スレッドが必要です。
ただし、トランザクションの受信が重ならないかぎりは、理論上の必要なスレッド数は必要ありません。
スレッドの占有期間に相当する受信処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるため安全係数を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するParticipantの台数+1の2倍未満になった場合は、トランザクションに参加するParticipantの台数+1を2倍したスレッド数としてください。
- X = A × (B+1) × C
-
X:スレッド数
A:目標TPS
B:トランザクションに参加するParticipant台数
D:受信処理時間(秒)
例)
- 目標40TPS、トランザクションに参加するParticipant2台、受信処理時間0.1秒とした場合、必要なスレッド数は12となります。
-
X = 40 × (2+1) × 0.1
X = 12
■Mediatorの受信処理に使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B
-
Y:キュー数
A:目標TPS
B:係数
例)
- 目標40TPS、係数を0.25とした場合、必要なキューサイズは10となります。
-
Y = 40 × 0.25
Y = 10
■分散合意処理に使用するスレッドプール
複数のトランザクションを同時に実行する場合、極力スレッドの空き待ちを発生しないようにするためにはトランザクションの同時実行数×トランザクションに参加するParticipantの台数分スレッドが必要です。
ただし、トランザクションの受信が重ならないかぎりは、理論上の必要なスレッド数は必要ありません。
スレッドの占有期間に相当する分散合意処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるため安全係数を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するParticipantの台数の2倍未満になった場合は、トランザクションに参加するParticipantの台数を2倍したスレッド数としてください。
- X = A × B × C
-
X:スレッド数
A:TPS
B: トランザクションに参加するParticipant台数
D: 分散合意処理時間(秒)
例)
- 目標40TPS、トランザクションに参加するParticipant2台、分散合意処理時間0.1秒とした場合、必要なスレッド数は8となります。
-
X = 40 × 2 × 0.1
X =8
■分散合意処理に使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B
-
Y:キュー数
A:目標TPS
B:係数
例)
- 目標40TPS、係数を0.25とした場合、必要なキューサイズは10となります。
-
Y = 40 × 0.25
Y = 10
■ConsensusLogファイルへの書き込みに使用するスレッドプール
複数のトランザクションを同時に実行する場合、極力スレッドの空き待ちを発生しないようにするためにはトランザクションの同時実行数分スレッドが必要です。
ただし、ConsensusLogファイルへの書き込みが重ならないかぎりは、理論上の必要なスレッド数は必要ありません。
スレッドの占有期間に相当するConsensusLogファイルへの書き込み処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるため安全係数を掛けることを推奨します。
- X = A × C
-
X:スレッド数
A:TPS
B: ConsensusLogファイルへの書き込み処理時間(秒)
例)
- 目標40TPS、ConsensusLogファイルへの書き込み処理時間0.05秒とした場合、必要なスレッド数は2となります。
-
X = 40 × 0.05
X = 2
■ConsensusLogファイルへの書き込みに使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B
-
Y:キュー数
A:目標TPS
B:係数
例)
- 目標40TPS、係数を0.25とした場合、必要なキューサイズは10となります。
-
Y = 40 × 0.25
Y = 10
■Mediatorの送信処理に使用するスレッドプール
複数のトランザクションを同時に実行する場合、極力スレッドの空き待ちを発生しないようにするためにはトランザクションの同時実行数×トランザクションに参加するParticipantの台数分スレッドが必要です。
ただし、トランザクションの送信が重ならないかぎりは、理論上の必要なスレッド数は必要ありません。
スレッドの占有期間に相当する送信処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるため安全係数を掛けることを推奨します。
算出したスレッド数がトランザクションに参加するParticipantの台数の2倍未満になった場合は、トランザクションに参加するParticipantの台数を2倍したスレッド数としてください。
- X = A × B × C
-
X:スレッド数
A:TPS
B: トランザクションに参加するParticipant台数
D:送信処理時間(秒)
例)
- 目標40TPS、トランザクションに参加するParticipant2台、送信処理時間0.05秒とした場合、必要なスレッド数は4となります。
-
X = 40 × 2 × 0.05
X =4
■Mediatorの送信処理に使用するキュー
複数のトランザクションを同時に実行する際、極力スレッドプールのキューの枯渇が発生しないようにするためには十分なキューサイズが必要です。
目標TPSに応じて、キューサイズを算出します。
TCC-Participant1台当たりの目標TPSを基準にした算出方法を次に示します。
Bの係数には実稼働を通して環境に合わせた数値を設定してください。
- Y = A × B
-
Y:キュー数
A:目標TPS
B:係数
例)
- 目標40TPS、係数を0.25とした場合、必要なキューサイズは10となります。
-
Y = 40 × 0.25
Y = 10
(b) チューニング対象のパラメタ一覧
|
項番 |
パラメタ |
説明 |
|---|---|---|
|
1 |
grpc.server.threadPoolSize |
Participant、Orchestratorからの受信に使用するスレッド数を指定します。 詳細は「7. パラメタ」を参照してください。 |
|
2 |
grpc.server.queueSize |
Participant、Orchestratorからの受信に使用するスレッドの割り当てを待つキューのサイズを指定します。 詳細は「7. パラメタ」を参照してください。 |
|
3 |
mediator.judge.threadPoolSize |
分散合意処理に使用するスレッド数を指定します。 詳細は「7. パラメタ」を参照してください。 |
|
4 |
mediator.judge.queueSize |
分散合意処理に使用するスレッドの割り当てを待つキューのサイズを指定します。 詳細は「7. パラメタ」を参照してください。 |
|
5 |
consensusLog.io.threadPoolSize |
ConsensusLogファイルへの書き込みに使用するスレッド数を指定します。 詳細は「7. パラメタ」を参照してください。 |
|
6 |
consensusLog.io.queueSize |
ConsensusLogファイルへの書き込みに使用するスレッドの割り当てを待つキューのサイズを指定します。 詳細は「7. パラメタ」を参照してください。 |
|
7 |
participant.sender.threadPoolSize |
Participantへの送信に使用するスレッド数を指定します。 詳細は「7. パラメタ」を参照してください。 |
|
8 |
participant.sender.queueSize |
Participantへの送信に使用するスレッドの割り当てを待つキューのサイズを指定します。 詳細は「7. パラメタ」を参照してください。 |
(c) チューニング方法
consensusLog.io.threadPoolSize
このパラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「9.4.3 メトリクス」を参照してください。
PrometheusのWeb UIで「executor_active_threads{job="mediator-scraper"}」のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
|
|
長い期間このパラメタで指定した値で推移している場合、スレッド不足によってConsensusLogの書き込み待ちが発生しているおそれがあります。このパラメタの値を増やすことで、下図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間。
|
|
また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。JaegerのWeb UIで確認したいトレース情報のTrace Pageを表示し、次のオペレーション名のspanの例を表示します。
-
grpc.server.threadPoolSize
オペレーション名「Recv.hmppcto.mediator.TerminationReceiverService.commit」
-
mediator.judge.threadPoolSize
オペレーション名「j.c.H.s.h.m.j.TerminationJudgeImpl$AsyncTerminationRequestTask:runImpl」
-
consensusLog.io.threadPoolSize
オペレーション名「j.c.H.s.h.m.a.i.d.DirectAccessConsensusLogReaderWriter:writeDirectIOConsensusLog」
-
participant.sender.threadPoolSize
オペレーション名「Sent:h.l.ConsensusJudgeReceiverService.receive」
上記spanのDurationが大きい場合、Mediatorのパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
分散トレースの確認方法の詳細については、「9.4.2 分散トレース」を参照してください。