3.10.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への送信に使用するスレッド数を指定します。 |
パラメタの詳細については、「8.2.2 Orchestrator」を参照してください。
(c) チューニング方法
mediator.termination-thread-pool-size
このパラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「10.5.3 メトリクス」を参照してください。
PrometheusのWeb UIで「executor_active_threads{job="orchestrator-scraper"}」のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
|
|
なお、1つのPrometheusで複数のOrchestratorのメトリクスを収集している場合は、クエリに「instance="TP1-BridgeのIPアドレス:TP1-Bridgeのhttpポート番号"」を追加してください。
- 入力例:
-
executor_active_threads{job="orchestrator-scraper", instance="192.168.125.166:20554"}
長い期間このパラメタで指定した値で推移している場合、スレッド不足によってMediatorへの送信待ちが発生しているおそれがあります。このパラメタの値を増やすことで、次の図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間です。
|
|
また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。JaegerのWeb UIで確認したいトレース情報のTrace Pageを表示し、次のオペレーション名のspanを表示します。
「hmppcto.mediator.TerminationReceiverService/commit」「hmppcto.mediator.TerminationReceiverService/rollback」
上記spanのStart Timeが次のspanのLogs「end AP」と差が大きい場合、このパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
オペレーション名「Recv:j.c.H.s.h.i.TxInterceptor:innerIntercept」
分散トレースの確認方法の詳細については、「10.5.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がトランザクション処理で実行するスレッド数を指定します。 |
|
2 |
sql.participant-processing.queue-size |
SQL-Participantがトランザクション処理に使用するスレッドの割り当て待ちをするキューのサイズを指定します。 |
|
3 |
mediator-process-management.thread-pool-size |
Mediatorへ送信を行うスレッドを管理するスレッド数を指定します。 |
|
4 |
mediator-communication.thread-pool-size |
ParticipantがMediatorと送受信を行うスレッド数を指定します。 |
|
5 |
mediator-communication.queue-size |
ParticipantがMediatorとの送受信に使用するスレッドの割り当て待ちをするキューのサイズを指定します。 |
各パラメタの詳細については、「8.2.4 SQL-Participant」を参照してください。
(c) チューニング方法
各パラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「10.5.3 メトリクス」を参照してください。
PrometheusのWeb UIで次に示す表のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
チューニング対象のパラメタと、下図に表示されたメトリクス名の関連づけは、「表3‒26 チューニング対象のパラメタとメトリクス名の関連づけ」を参照してください。メトリクス名は、クエリを実行した結果によって「name="メトリクス名"」と表示されるため、該当する表示個所からメトリクス名を確認してください。
|
チューニング対象のパラメタ |
クエリ |
|---|---|
|
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 |
|
チューニング対象のパラメタ |
メトリクス名 |
|---|---|
|
sql.participant-processing.thread-pool-size |
jp.co.Hitachi.soft.hmppcto.db.osc.GrpcTransactionBranchRequestService:prepareRequest |
|
jp.co.Hitachi.soft.hmppcto.db.osc.GrpcTransactionBranchRequestService:cancelRequest |
|
|
jp.co.Hitachi.soft.hmppcto.txpaxosmanager.osc.OscProposalController#terminate:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.ConsensusJudgeObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionNotify:sendTransactionNotify |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminationProposalObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionVerifyNotifyObserverImpl:observe |
|
|
sql.participant-processing.queue-size |
jp.co.Hitachi.soft.hmppcto.db.osc.GrpcTransactionBranchRequestService:prepareRequest |
|
jp.co.Hitachi.soft.hmppcto.db.osc.GrpcTransactionBranchRequestService:cancelRequest |
|
|
jp.co.Hitachi.soft.hmppcto.txpaxosmanager.osc.OscProposalController#terminate:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.ConsensusJudgeObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionNotify:sendTransactionNotify |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminationProposalObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionVerifyNotifyObserverImpl:observe |
|
|
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
オペレーション名「hmppcto.mediator.TerminationReceiverService/propose」
オペレーション名「hmppcto.mediator.TerminationReceiverService/notifyTerminationResult」
オペレーション名「hmppcto.mediator.TerminationReceiverService/notifyTerminatedTransaction」
上記spanのDurationが大きい場合、SQL-Participantのパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
分散トレースの確認方法の詳細については、「10.5.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がトランザクション処理で実行するスレッド数を指定します。 |
|
2 |
tcc.participant-processing.queue-size |
TCC-Participantがトランザクション処理に使用するスレッドの割り当てを待つキューのサイズを指定します。 |
|
3 |
mediator-process-management.thread-pool-size |
Mediatorへ送信を行うスレッドを管理するスレッド数を指定します。 |
|
4 |
mediator-communication.thread-pool-size |
ParticipantがMediatorと送受信を行うスレッド数を指定します。 |
|
5 |
mediator-communication.queue-size |
ParticipantがMediatorとの送受信に使用するスレッドの割り当てを待つキューのサイズを指定します。 |
各パラメタの詳細については、「8.2.5 TCC-Participant」を参照してください。
(c) チューニング方法
各パラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「10.5.3 メトリクス」を参照してください。
PrometheusのWeb UIで次に示す表のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
チューニング対象のパラメタと、下図に表示されたメトリクス名の関連づけは、「表3‒29 チューニング対象のパラメタとメトリクス名の関連づけ」を参照してください。メトリクス名は、クエリを実行した結果によって「name="メトリクス名"」と表示されるため、該当する表示個所からメトリクス名を確認してください。
|
チューニング対象のパラメタ |
クエリ |
|---|---|
|
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 |
|
チューニング対象のパラメタ |
メトリクス名 |
|---|---|
|
tcc.participant-processing.thread-pool-size |
jp.co.Hitachi.soft.hmppcto.participant.tcc.interceptor.TccOscController:terminate |
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.ConsensusJudgeObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionNotify:sendTransactionNotify |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminationProposalObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionVerifyNotifyObserverImpl:observe |
|
|
tcc.participant-processing.queue-size |
jp.co.Hitachi.soft.hmppcto.participant.tcc.interceptor.TccOscController:terminate |
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.ConsensusJudgeObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionNotify:sendTransactionNotify |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminationProposalObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionVerifyNotifyObserverImpl:observe |
|
|
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
オペレーション名「hmppcto.mediator.TerminationReceiverService/propose」
オペレーション名「hmppcto.mediator.TerminationReceiverService/notifyTerminationResult」
オペレーション名「hmppcto.mediator.TerminationReceiverService/notifyTerminatedTransaction」
上記spanのDurationが大きい場合、TCC-Participantのパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
分散トレースの確認方法の詳細については、「10.5.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からの受信に使用するスレッド数を指定します。 |
|
2 |
grpc.server.queueSize |
Participant、Orchestratorからの受信に使用するスレッドの割り当てを待つキューのサイズを指定します。 |
|
3 |
mediator.judge.threadPoolSize |
分散合意処理に使用するスレッド数を指定します。 |
|
4 |
mediator.judge.queueSize |
分散合意処理に使用するスレッドの割り当てを待つキューのサイズを指定します。 |
|
5 |
consensusLog.io.threadPoolSize |
ConsensusLogファイルへの書き込みに使用するスレッド数を指定します。 |
|
6 |
consensusLog.io.queueSize |
ConsensusLogファイルへの書き込みに使用するスレッドの割り当てを待つキューのサイズを指定します。 |
|
7 |
participant.sender.threadPoolSize |
Participantへの送信に使用するスレッド数を指定します。 |
|
8 |
participant.sender.queueSize |
Participantへの送信に使用するスレッドの割り当てを待つキューのサイズを指定します。 |
各パラメタの詳細については、「8.3.1 Mediator」を参照してください。
(c) チューニング方法
consensusLog.io.threadPoolSize
このパラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「10.5.3 メトリクス」を参照してください。
PrometheusのWeb UIで「executor_active_threads{job="mediator-scraper"}」のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
|
|
長い期間このパラメタで指定した値で推移している場合、スレッド不足によってConsensusLogの書き込み待ちが発生しているおそれがあります。このパラメタの値を増やすことで、下図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間です。
|
|
また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。JaegerのWeb UIで確認したいトレース情報のTrace Pageを表示し、次のオペレーション名のspanの例を表示します。
-
grpc.server.threadPoolSize
オペレーション名「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
オペレーション名「hmppcto.learner.ConsensusJudgeReceiverService/receive」
上記spanのDurationが大きい場合、Mediatorのパラメタで指定するスレッドが不足してスレッドの空き待ち状態になっているおそれがあります。
分散トレースの確認方法の詳細については、「10.5.2 分散トレース」を参照してください。
(6) TP1-Bridge
TP1-Bridgeでチューニングが必要なスレッドは、次に示す2つです。
-
HMP-PCTOが使用するSpring Bootの組み込みhttpサーバのTomcatが制御するスレッド
-
HMP-PCTOが制御するスレッド
それぞれの設計指針、およびチューニング方法を説明します。
(a) Spring Bootの組み込みhttpサーバのTomcatが制御するスレッド
TP1-BridgeがAPから受け付けたリクエストは、Spring Bootの組み込みhttpサーバが制御するワーカースレッドで実行されます。そのため、ワーカースレッドのスレッド数がチューニングの対象となります。TP1-Bridgeがワーカースレッドを占有する期間は、APからのリクエストを受け付けたTP1-Bridgeのサービスが開始してから、APに応答を送信して終了するまでです。これには、TP1-Converterでのデータ変換処理の時間およびOpenTP1のSPPのサービス実行時間が含まれます。
Spring Bootの組み込みhttpサーバのTomcatがワーカースレッドを制御する仕組みについては、Tomcatのドキュメントを参照してください。
■設計指針
複数のトランザクションを同時に実行する際、スレッドの空き待ちによるタスクの実行遅延が極力発生しないようにするためには、トランザクションの同時実行数+3のスレッドが必要です。トランザクション外で実行するメトリクスの収集処理などが使用するスレッドを考慮して、3を加算しています。
同一のTP1-Bridgeを使用するOrchestrator/Entity-Serviceが複数ある場合は、それぞれのトランザクションの同時実行数の合計数分のスレッドが必要です。
スレッドの占有期間にTP1-Bridgeのサービスの処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために、安全率を掛けることを推奨します。なお、算出したスレッド数が10未満となる場合は、10以上の値を設定してください。
目標TPSを基準にした算出方法を次に示します。
- X = (A × B) +3
-
X:スレッド数
A:目標TPS
B:TP1-Bridgeのサービスの処理時間(秒)(データ変換およびOpenTP1のSPPの処理時間を含みます)
例)
- 目標40TPS、TP1-Bridgeのサービスの処理時間0.2秒とした場合、必要なスレッド数は11となります。
-
X = (40 × 0.2) + 3
X = 11
- 安全率を1.5とした場合、必要なスレッド数は17となります。
-
X = 11 × 1.5
X ≒ 17
■チューニング対象のパラメタ一覧
チューニング対象のパラメタは、Spring Bootのパラメタです。パラメタの詳細については、Spring Bootのドキュメントを参照してください。
|
項番 |
パラメタ |
説明 |
|---|---|---|
|
1 |
server.tomcat.threads.max |
TP1-BridgeがAPから受け付けたリクエストの処理を実行するワーカースレッドの最大数を設定します。 |
■チューニング方法
server.tomcat.threads.max
このパラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法の詳細については、「10.5.3 メトリクス」を参照してください。
PrometheusのWeb UIで「tomcat_threads_current_threads{job="tp1-bridge-scraper"}」のクエリを入力し、Executeボタンを押すことでGraphタブに次の図のような状態で表示されます。
|
|
なお、1つのPrometheusで複数のTP1-Bridegのメトリクスを収集している場合は、クエリに「instance="TP1-BridgeのIPアドレス:TP1-Bridgeのhttpポート番号"」を追加してください。
- 入力例:
-
tomcat_threads_current_threads{job="tp1-bridge-scraper", instance="192.168.125.166:20554"}
長い期間このパラメタで指定した値で推移している場合、スレッド不足によってOpenTP1のサービスの呼び出し処理の実行待ちが発生しているおそれがあります。このパラメタの値を増やすことで、次の図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間です。
|
|
(b) HMP-PCTOが制御するスレッド
HMP-PCTOが制御するスレッドは、次に示す3つのスレッドプールを使用して制御します。
-
トランザクション処理に使用するスレッドプール
-
Mediatorへ送信を行うスレッドの管理に使用するスレッドプール
-
gRPC通信制御に使用するスレッドプール
それぞれのスレッドプールの役割およびスレッドプールの占有期間は、制御に使用するパラメタ名が異なるだけで、SQL-Participantが制御するスレッドプールと同じです。スレッドプールの役割およびスレッドプールの占有期間の詳細については、「(3) SQL-Participant」を参照してください。
なお、「(3) SQL-Participant」で説明しているSQLの実行に相当するTP1-Bridgeでの処理は、OpenTP1に対するRPCの実行です。RPCの実行は、Spring Bootが制御するスレッドプールで行います。そのため、RPCの実行ではトランザクション処理に使用するスレッドプールは使用しません。
■設計指針
SQL-Participantの設計指針と同じです。「(3) SQL-Participant」を参照してください。
■チューニング対象のパラメタ一覧
|
項番 |
パラメタ |
説明 |
|---|---|---|
|
1 |
tp1.participant-processing.thread-pool-size |
TP1-Bridgeがトランザクション処理で実行するスレッド数を指定します。 |
|
2 |
tp1.participant-processing.queue-size |
TP1-Bridgeがトランザクション処理に使用するスレッドの割り当て待ちをするキューのサイズを指定します。 |
|
3 |
mediator-process-management.thread-pool-size |
TP1-BridgeがMediatorへ送信を行うスレッドを管理するスレッド数を指定します。 |
|
4 |
mediator-communication.thread-pool-size |
TP1-BridgeがMediatorと送受信を行うスレッド数を指定します。 |
|
5 |
mediator-communication.queue-size |
TP1-BridgeがMediatorとの送受信に使用するスレッドの割り当て待ちをするキューのサイズを指定します。 |
各パラメタの詳細については、「8.3.2 TP1-Bridge(通常版かつTP1-Bridge限定)」を参照してください。
■チューニング方法
各パラメタに関する情報はメトリクスデータによって確認できます。メトリクスデータの確認方法については、「10.5.3 メトリクス」を参照してください。
PrometheusのWeb UIで次に示す表のクエリを入力し、Executeボタンを押すことでGraphタブに下図のような状態で表示されます。
チューニング対象のパラメタと、下図に表示されたメトリクス名の関連づけは、「表3‒35 チューニング対象のパラメタとメトリクス名の関連づけ」を参照してください。メトリクス名は、クエリを実行した結果によって「name="メトリクス名"」と表示されるため、該当する表示個所からメトリクス名を確認してください。
|
チューニング対象のパラメタ |
クエリ |
|---|---|
|
tp1.participant-processing.thread-pool-size |
executor_active_threads{job="tp1-bridge-scraper"} |
|
mediator-process-management.thread-pool-size |
|
|
mediator-communication.thread-pool-size |
|
|
tp1.participant-processing.queue-size |
executor_queued_tasks{job=" tp1-bridge-scraper"} |
|
mediator-communication.queue-size |
|
チューニング対象のパラメタ |
メトリクス名 |
|---|---|
|
tp1.participant-processing.thread-pool-size |
jp.co.Hitachi.soft.hmppcto.adapter.TP1BridgeProposalEventObserver:observe |
|
jp.co.Hitachi.soft.hmppcto.txpaxosmanager.osc.OscProposalController#terminate:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.ConsensusJudgeObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionNotify:sendTransactionNotify |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminationProposalObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionVerifyNotifyObserverImpl:observe |
|
|
tp1.participant-processing.queue-size |
jp.co.Hitachi.soft.hmppcto.adapter.TP1BridgeProposalEventObserver:observe |
|
jp.co.Hitachi.soft.hmppcto.txpaxosmanager.osc.OscProposalController#terminate:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.ConsensusJudgeObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionNotify:sendTransactionNotify |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminationProposalObserverImpl:observe |
|
|
jp.co.Hitachi.soft.hmppcto.participant.common.osc.TerminatedTransactionVerifyNotifyObserverImpl:observe |
|
|
executor_active_threads{job="tp1-bridge-scraper"}の結果が、長い期間tp1.participant-processing.thread-pool-size、mediator-process-management.thread-pool-size、またはmediator-communication.thread-pool-sizeで指定した値で推移している場合、スレッド不足によって処理の遅延が発生しているおそれがあります。これらのパラメタの値を増やすことで、次の図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間です。
|
|
また、executor_queued_tasks{job="tp1-bridge-scraper"}の結果が、tp1.participant-processing.queue-sizeやmediator-communication.queue-sizeで指定した値で推移している場合、キューサイズ不足が発生しているおそれがあります。これらのパラメタの値を増やすことでキューサイズ不足を防ぐことができます。
なお、分散トレースデータでも、スレッドの空き待ち状態になっているかどうかを確認できます。JaegerのWeb UIで確認したいトレース情報のTrace Pageを表示し、次のオペレーション名のspanを表示します。
-
tp1.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
オペレーション名「hmppcto.mediator.TerminationReceiverService/propose」
オペレーション名「hmppcto.mediator.TerminationReceiverService/notifyTerminationResult」
オペレーション名「hmppcto.mediator.TerminationReceiverService/notifyTerminatedTransaction」
上記spanのDurationが大きい場合、TP1-Bridgeのパラメタで指定したスレッドの不足によるスレッドの空き待ち状態になっているおそれがあります。
分散トレースの確認方法の詳細については、「10.5.2 分散トレース」を参照してください。
(7) TP1-Converter
TP1-Converterのデータ変換、キャッシュのリフレッシュ、およびキャッシュの参照の各処理は、uCosminexus Service PlatformのJ2EEサーバ上のWebコンテナリクエスト処理スレッド(NIO HTTPサーバのリクエスト処理スレッド/ワーカースレッド)で動作します。そのため、リクエスト処理スレッドの最大数は、uCosminexus Application Serverのusrconf.properties(J2EEサーバ用ユーザプロパティファイル)のパラメタで設定します。
(a) 設計指針
複数のトランザクションを同時に実行する際、極力スレッドの空き待ちが発生しないようにするためにはトランザクションの同時実行数分+1のスレッドが必要です。トランザクション外で実行するキャッシュのリフレッシュ、またはキャッシュの参照で使用するスレッドを考慮して1を加算しています。
ただし、データ変換処理が重ならないかぎりは、トランザクションの同時実行数分のスレッドは必要ありません。
スレッドの占有期間に相当する処理時間を設定して、目標とする1秒間当たりのトランザクション処理数(TPS)を処理するためのスレッド数を算出します。
算出したスレッド数に余裕を持たせるために安全率を掛けることを推奨します。
なお、算出したスレッド数が10未満となる場合は、10以上の値を設定してください。
目標TPSを基準にした算出方法を次に示します。
- X = (A × B) +1
-
X:スレッド数
A:目標TPS
B:データ変換の処理時間(秒)
例)
- 目標40TPS、データ変換の処理時間を0.1秒とした場合、必要なスレッド数は5となります。
-
X = (40 × 0.1) + 1
X = 5
- 安全率を1.5とした場合、必要なスレッド数は8となります。
-
X = 5 × 1.5
X ≒ 8
10未満のため、10を設定します。
(b) チューニング対象のパラメタ一覧
チューニング対象のパラメタは、uCosminexus Service Platformのusrconf.properties(J2EEサーバ用ユーザプロパティファイル)のパラメタです。パラメタの詳細は、マニュアル「Cosminexus アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。
|
項番 |
パラメタ |
説明 |
|---|---|---|
|
1 |
webserver.connector.nio_http.max_threads |
TP1-Bridgeのデータ変換機能を実行するリクエスト処理スレッドの最大数を設定します。 |
|
2 |
webserver.connector.nio_http.max_servlet_execute_threads |
webserver.connector.nio_http.max_threadsと同じ値を設定してください。 webserver.connector.nio_http.max_threadsのうち、Webコンテナが同期サーブレットを実行するスレッドの最大数を指定します。 なお、TP1-Converterは、同期サーブレットとして実装しています。 |
(c) チューニング方法
チューニングに必要な情報は、uCosminexus Service PlatformがWebコンテナの稼働情報ファイルに出力されます。
Webコンテナの稼働情報ファイルに出力されるNIO HTTPサーバの実行中スレッド数の前回の稼働情報ファイルの出力時からの最大値(WorkerThreadCount.HighWaterMark)や現在値(WorkerThreadCount.Current)が、長時間パラメタ設定値で推移している場合は、データ変換処理がスレッド不足によって実行できないため、トランザクションの実行時間が長くなっている、またはTPSが低下していることが考えられます。パラメタの設定値を増やすことで、トランザクションの実行時間やTPSが改善できる場合があります。
Webコンテナの稼働情報ファイルの詳細については、マニュアル「Cosminexus アプリケーションサーバ 機能解説 運用/監視/連携編」を参照してください。