コンテンツにスキップ

4-5. パフォーマンスチューニング

xrpld はネットワーク通信・コンセンサス・ストレージ I/O を並行して処理する高負荷なソフトウェアです。このページでは、パフォーマンスを支える内部の仕組みと、計測・チューニングの入り口を解説します。コントリビューションで性能に関わる変更を加えるとき、何を見るべきかの土台になります。

xrpld の多くの処理は JobQueue を通じて非同期に実行されます。ジョブの投入は各サブシステム(Overlay、LedgerMaster 等)から行われ、実装は JobQueueJob 型で管理されます。

include/xrpl/core/JobQueue.h
include/xrpl/core/Job.h
src/libxrpl/core/detail/JobQueue.cpp

JobQueue は、種類(Job タイプ)ごとに優先度を持つジョブをワーカースレッドのプールで処理する仕組みです。トランザクションの検証、Ledger の取得、ピアからのメッセージ処理などが「ジョブ」として投入されます。

ジョブ投入 → [ JobQueue ] → ワーカースレッドプール → 実行
(種類ごとに優先度)

ボトルネックを調べるときは、「どの種類のジョブが滞留しているか」を見ることが多くなります。

スレッド数は xrpld.cfg で調整できます。

設定役割
[workers]ピア・クライアントからの処理を担うスレッド数。既定はCPUスレッド数+2(スタンドアロンは1)
[io_workers]生の入出力(IO)を処理するスレッド数
[prefetch_workers]NodeStore の先読み用スレッド数
# xrpld.cfg の例
[workers]
6

xrpld には、ジョブやRPCの実行状況を記録する perflog という機能があります。

src/xrpld/perflog/detail/PerfLogImp.cpp

xrpld.cfg[perf] セクションで有効化すると、ジョブの実行回数・待ち時間などが定期的にログファイルへ出力されます。

[perf]
perf_log=/var/log/xrpld/perf.log

このログを分析すると、どのジョブタイプがボトルネックになっているかを定量的に把握できます。

メモリ使用量やリークの調査には、jemalloc を使ったヒーププロファイリングが利用できます。リポジトリには docs/HeapProfiling.md もありますが、古い scons 時代の例を含むため、現在のCMake/Conanビルドでは conanfile.py とCMakeの jemalloc オプションも確認します。

docs/HeapProfiling.md
conanfile.py
cmake/XrplInterface.cmake

要点:

  • Conan の jemalloc オプションを有効にして jemalloc 依存を入れる
  • CMake 側の jemalloc 変数が有効になると PROFILE_JEMALLOC が定義される
  • 実行中のプロセスからヒープのダンプを取得して解析する

パフォーマンス改善の鉄則は「推測せず、計測する」です。

flowchart TD
  s1["1. 計測(perflog / プロファイラ / ベンチマーク)"]
  s2["2. ボトルネックを特定"]
  s3["3. その箇所だけ改善"]
  s4["4. 再計測して効果を確認"]
  s1 --> s2 --> s3 --> s4

ボトルネックになりやすい領域

Section titled “ボトルネックになりやすい領域”
領域着目点
NodeStore I/Oディスク速度・キャッシュヒット率(4-6 参照)
SHAMap 操作ノードの探索・ハッシュ計算(4-4 参照)
シリアライズSTObject のエンコード/デコード
JobQueue特定ジョブの滞留・優先度

パフォーマンスを支える仕組みと計測の考え方を理解しました。続いて、もう一つの基盤である NodeStoreとストレージ層 で、データがどう永続化されるかを見ていきましょう。