Hitachi

Hitachi Microservices Platform - Paxos Commit Transaction Orchestrator ユーザーズガイド


3.10.1 スレッドプール

〈この項の構成〉

(1) Orchestrator

Mediatorへの送信時(トランザクション決着要求・仕掛中トランザクションのキャンセル要求)の同時実行スレッド数を制御します。同時実行スレッド数はOrchestratorのパラメタ「mediator.termination-thread-pool-size」で指定します。同時実行スレッド数を超えた要求がある場合は、キューに保持します。

図3‒1 同時実行スレッド数制御

[図データ]

1トランザクションが終了した際に、トランザクションに参加したMediatorの数だけスレッドを使用します。また、スレッドはMediatorへ送信してから応答を受信するまで占有します。

図3‒2 スレッド占有期間

[図データ]

(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) チューニング対象のパラメタ一覧

表3‒23 Orchestratorのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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タブに下図のような状態で表示されます。

図3‒3 PrometheusのWeb UI

[図データ]

なお、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は改善後の処理時間です。

図3‒4 PrometheusのWeb UI

[図データ]

また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。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 分散トレース」を参照してください。

スレッドが空き待ちになっている状態の参考データを下図に示します。

図3‒5 スレッドが空き待ち状態

[図データ]

(2) Entity-Service

HMP-PCTOが制御するスレッドは存在しないため、HMP-PCTOのスレッドに関するパラメタのチューニングは必要ありません。

(3) SQL-Participant

SQL-Participantでは次に示す3つのスレッドプールがあります。

それぞれのスレッドプールについて以降に説明します。

SQL-Participantのトランザクション処理に使用するスレッドプールでは、Entity-ServiceからのPrepare指示/トランザクションのキャンセル指示・投票処理・分散合意処理・トランザクション完了通知処理の同時実行スレッド数を制御します。同時実行スレッド数はSQL-Participantのパラメタ「sql.participant-processing.thread-pool-size」で指定します。キュー数はSQL-Participantのパラメタ「sql.participant-processing.queue-size」で指定します。

このスレッドプールで使用するスレッドとその占有期間は次のとおりです。

Mediatorへ送信を行うスレッドの管理に使用するスレッドプールでは、gRPC通信制御に使用するスレッドを生成する処理の同時実行スレッド数を制御します。同時実行スレッド数はSQL-Participantのパラメタ「mediator-process-management.thread-pool-size」で指定します。

このスレッドプールで使用するスレッドとその占有期間は次のとおりです。

gRPC通信制御に使用するスレッドプールでは、ParticipantがMediatorと送受信を行う処理の同時実行スレッド数を制御します。同時実行スレッド数はSQL-Participantのパラメタ「mediator-communication.thread-pool-size」で指定します。キュー数はSQL-Participantのパラメタ「mediator-communication.queue-size」で指定します。

このスレッドプールで使用するスレッドとその占有期間は次のとおりです。

(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) チューニング対象のパラメタ一覧

表3‒24 SQL-Participantのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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="メトリクス名"」と表示されるため、該当する表示個所からメトリクス名を確認してください。

表3‒25 Prometheusで利用するクエリ

チューニング対象のパラメタ

クエリ

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

表3‒26 チューニング対象のパラメタとメトリクス名の関連づけ

チューニング対象のパラメタ

メトリクス名

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

図3‒8 PrometheusのWeb UI

[図データ]

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は改善後の処理時間です。

図3‒9 PrometheusのWeb UI

[図データ]

また、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のトランザクション処理に使用するスレッドプールでは、投票処理・分散合意処理・トランザクション完了通知処理の同時実行スレッド数を制御します。同時実行スレッド数はTCC-Participantのパラメタ「tcc.participant-processing.thread-pool-size」で指定します。キュー数はTCC-Participantのパラメタ「tcc.participant-processing.queue-size」で指定します。

このスレッドプールで使用するスレッドとその占有期間は次のとおりです。

Mediatorへ送信を行うスレッドの管理に使用するスレッドプールでは、gRPC通信制御に使用するスレッドを生成する処理の同時実行スレッド数を制御します。同時実行スレッド数はTCC-Participantのパラメタ「mediator-process-management.thread-pool-size」で指定します。

このスレッドプールで使用するスレッドとその占有期間は次のとおりです。

gRPC通信制御に使用するスレッドプールでは、ParticipantがMediatorと送受信を行う処理の同時実行スレッド数を制御します。同時実行スレッド数はTCC-Participantのパラメタ「mediator-communication.thread-pool-size」で指定します。キュー数はTCC-Participantのパラメタ「mediator-communication.queue-size」で指定します。

このスレッドプールで使用するスレッドとその占有期間は次のとおりです。

(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) チューニング対象のパラメタ一覧

表3‒27 TCC-Participantのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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="メトリクス名"」と表示されるため、該当する表示個所からメトリクス名を確認してください。

表3‒28 Prometheusで利用するクエリ

チューニング対象のパラメタ

クエリ

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

表3‒29 チューニング対象のパラメタとメトリクス名の関連づけ

チューニング対象のパラメタ

メトリクス名

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

図3‒12 PrometheusのWeb UI

[図データ]

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は改善後の処理時間です。

図3‒13 PrometheusのWeb UI

[図データ]

また、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つのスレッドプールがあります。

表3‒30 Mediatorのスレッドプール

項番

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への送信完了まで占有します。

図3‒14 同時実行スレッド数制御

[図データ]

(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) チューニング対象のパラメタ一覧

表3‒31 Mediatorのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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タブに下図のような状態で表示されます。

図3‒15 PrometheusのWeb UI

[図データ]

長い期間このパラメタで指定した値で推移している場合、スレッド不足によってConsensusLogの書き込み待ちが発生しているおそれがあります。このパラメタの値を増やすことで、下図のように処理時間を改善できる場合があります。図中のXは改善前の処理時間、図中のYは改善後の処理時間です。

図3‒16 PrometheusのWeb UI

[図データ]

また、分散トレースデータでもスレッドの空き待ち状態になっているかどうか確認できます。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つです。

それぞれの設計指針、およびチューニング方法を説明します。

(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のドキュメントを参照してください。

表3‒32 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タブに次の図のような状態で表示されます。

図3‒17 PrometheusのWeb UI

[図データ]

なお、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は改善後の処理時間です。

図3‒18 PrometheusのWeb UI

[図データ]

(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」を参照してください。

■チューニング対象のパラメタ一覧

表3‒33 TP1-Bridgeのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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="メトリクス名"」と表示されるため、該当する表示個所からメトリクス名を確認してください。

表3‒34 Prometheusで利用するクエリ

チューニング対象のパラメタ

クエリ

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

表3‒35 チューニング対象のパラメタとメトリクス名の関連づけ

チューニング対象のパラメタ

メトリクス名

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

図3‒19 PrometheusのWeb UI

[図データ]

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は改善後の処理時間です。

図3‒20 PrometheusのWeb UI

[図データ]

また、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 アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。

表3‒36 TP1-Converterのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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 アプリケーションサーバ 機能解説 運用/監視/連携編」を参照してください。