コンテンツにスキップ Z
INPUT PROOF GENERATION VERIFY OUTPUT TOTAL TRANSACTION FLOW インデクサのベンチマーク: Zaino vs Ztreamer
ZainoとZtreamerは、Zcashのライトウォレットが同期に使用する API である lightwallet gRPC プロトコルを提供する、2つのインデクサです。このページでは、両者が同じ応答を返すか、インデックスの構築にかかる時間、そしてウォレットへの応答速度について、独立して再現可能な比較を要約します。
要約
両方のインデクサは正しいチェーンデータを返します。Zebraと照合可能なすべての応答は一致したため、ウォレットはいずれも使用できます。
見つかった差異は、慣例とエッジケースです。エラーコード、あるハッシュのバイト順、重複アドレスのカウント方法、および一部の JSON-RPC 応答形式が異なります。
Ztreamerは同一 CPU で約 6 倍高速にインデックスを構築します。Zainoは構築中にリクエストをZebraへ転送するため、6 秒後には応答を開始します。
Ztreamerは測定したすべてのシナリオでより高速に応答します。完全なウォレットダウンロードでは、毎秒あたりのブロック数が 13~17 倍多くなります。
Zainoのレイテンシの大部分は、欠落している 1 つのソケット設定(TCP_NODELAY)に起因しており、多くのリクエストに約 40 ms が追加されます。1行の修正で解決できます。
比較対象
ビルド バックエンドノード 理由 Zaino 0.10.1 Zebra 6.4.2(directバックエンド) 最新の安定版Zainoリリース Zaino 0.9.0 Zebra 6.4.2(directバックエンド) Ztreamerが公開した比較で測定されたバージョン Ztreamer v0.1.0 組み込みZakuraノード 最新のZtreamerタグ Ztreamer master 組み込みZakura 1.5.1 Ztreamerのインストール手順でビルドされるもの
両者は異なる設計を採用しています。
Zaino は、Zebra フルノードの横で別プロセスとして動作し、Zebraの状態を読み取り、独自のインデックスを維持します。これはZ3 スタック 内のインデクサです。Zaino を参照してください。
Ztreamer は、同一プロセス内にZakura ノード(Zebraのフォーク)を組み込み、コンパクトブロックのインデックスを維持します。
測定方法
全員が同じデータを使用。 すべてのビルドは、高さ 4,382,897 で固定された同一のZcash Foundationテストネットスナップショットから開始したため、まったく同じチェーンをインデックス化しました。
誰でも再現可能。 すべて無料のGitHubホステッドランナー上で実行されます。リポジトリをフォークし、1つのワークフローを実行するだけです。
ビルドごとに 3 回実行 し、それぞれ空のインデックスから開始しました。サーバーと負荷ジェネレータは別々の CPU コアで実行しました。
互換性: lightwallet プロトコルの全 20 gRPC メソッド(274 のテストケース)をビルド間でバイト単位で比較し、Zebraの JSON-RPC と照合しました。Zainoが提供する 28 の JSON-RPC メソッドも確認しました。
パフォーマンス: インデックス構築の時間とリソース、リクエストごとのレイテンシ、ブロック範囲のスループット、同時クライアント数 1~128、およびSaplingの有効化から先端までの完全なウォレットダウンロードを測定しました。
結果
インデックス構築
3 回の実行の中央値:
ビルド インデックス完了 最初の応答 ディスク上のインデックスサイズ Zaino 0.10.1 1,395 s 6 s 22.06 GiB Zaino 0.9.0 1,211 s 6 s 22.06 GiB Ztreamer v0.1.0 216 s 210 s 1.44 GiB Ztreamer master 159 s 158 s 1.44 GiB
Zainoは構築中にリクエストをZebraへ転送するため、ほぼ即座に使用できます。Ztreamerは、インデックスが完了するまで何も提供しません。同一 CPU モデルでは、Zaino 0.10.1 はZtreamer v0.1.0 の 6~6.5 倍の時間を要し、CPU 時間は 7.5~8 倍でした(Zebraを含む)。
応答性能
特記のない限り、3 回の実行の中央値(毎秒ブロック数):
シナリオ Zaino 0.10.1 Ztreamer v0.1.0 1,000 ブロックのブロック範囲 11,414 179,486 完全なウォレットダウンロード(280,000 → 先端) 11,124 189,041 1,000 ブロックのブロック範囲、128 クライアント 110,093 229,527 単一ブロック、128 クライアント(リクエスト/s) 6,843 11,044
128 クライアントでは、両サーバーが 2 CPU コアに制限されていたため、差は約 2 倍まで縮まります。
40 ms の下限
Zainoでは、12 個の RPC のうち 6 個の中央値レイテンシが約 40 ms であり、すべての RPC の 99 パーセンタイルが約 41 ms です。原因はZainoの gRPC リスナー設定方法です。TCP_NODELAYソケットオプションが一度も有効化されないため、オペレーティングシステムは小さな応答を最大 40 ms 保留します。
Zainoバイナリを変更せず、外部からこのオプションを有効にすると、下限は解消されました。たとえば、GetTreeStateは 40.3 ms から 0.75 ms へ低下しました(Ztreamer: 0.63 ms)。大量ブロックのストリーミングは変化しなかったため、上記のスループット差は実際のものです。
互換性の差異
Zaino 0.9.0 は、プロトコル上のデフォルトがシールドデータのみであるにもかかわらず、デフォルトでGetBlockに透明データを含めます。これは 0.10.1 で修正されています。
GetSubtreeRoots: completingBlockHashフィールドは、2つのインデクサでバイト順が逆です。現在のウォレットはこのフィールドを読み取りません。
エラーコード: Zainoは不正な入力に対してINTERNALを返します。ZtreamerはINVALID_ARGUMENTまたはNOT_FOUNDを返します。
GetTaddressBalanceStream内の重複アドレス は、Ztreamer master を除き、2回カウントされます。
JSON-RPC: Zainoのgetrawtransactionは、verbosity 0 ではZebraおよびzcashdと異なり、16進文字列ではなくオブジェクトを返します。
制限事項
テストネットのみ。 テストネットのブロックはメインネットより小さいため、絶対的な時間とサイズはメインネットの数値ではありません。この比較は、同一入力での相対比較です。
複数の CPU モデルを使用する共有 CI マシン。 完全なレポートでは、主要な数値について同一 CPU での比較を示しています。
未測定: リオーグ、生きているチェーン先端の追跡、メンプール負荷、および TLS。
さらに詳しく知るには