Hitachi

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


3.7.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‒18 Orchestratorのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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

図3‒3 PrometheusのWeb UI

[図データ]

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

図3‒4 PrometheusのWeb UI

[図データ]

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

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

図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‒19 SQL-Participantのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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

表3‒20 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‒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

    オペレーション名「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のトランザクション処理に使用するスレッドプールでは、投票処理・分散合意処理・トランザクション完了通知処理の同時実行スレッド数を制御します。同時実行スレッド数は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‒21 TCC-Participantのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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

表3‒22 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‒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

    オペレーション名「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つのスレッドプールがあります。

表3‒23 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‒24 Mediatorのチューニング対象のパラメタ一覧

項番

パラメタ

説明

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

図3‒15 PrometheusのWeb UI

[図データ]

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

図3‒16 PrometheusのWeb UI

[図データ]

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