コンテンツにスキップ

実測 transport (--stats)

英語版が正です。この文書は 2026-09-06 時点の英語版に対応しています。

discovery のデータは「こうなるはず」を教えてくれます。--stats を付けると、ツールは Fast DDS statistics モジュール のトピックも購読し、「実際にこうなった」を表示します。

トピック 用途
_fastdds_statistics_rtps_sent 各 participant が各宛先 locator に送った RTPS パケット数/バイト数。reader が広告した locator と突き合わせ、実際にパケットを運んだ locator の種類を得ます (measured=SHM 47pkt)。予測と食い違えば !measured-transport-mismatch を付けます。
_fastdds_statistics_history2history_latency (LATENCY 列: write-to-notification 遅延の平均と最大、JSON の measured.latency_s とトピックの latency_s。ホスト間ではクロックのずれを含む) writer のサンプルが特定の reader に届いたことの証明。RTPS の痕跡を残さない zero-copy data-sharing の確認に使います。
_fastdds_statistics_physical_data participant ごとのホスト名、ユーザー、プロセス id。local / host:<id> の代わりに表示します。
_fastdds_statistics_publication_throughput writer ごとの payload バイト数/秒。RATE 列 (トピックは writer の合算) と JSON (ペアの measured.throughput_bytes_per_s、トピックの topics[].throughput_bytes_per_s) に出ます。transport に依らないので zero-copy の data-sharing も定量化できます。
_fastdds_statistics_rtps_lost reader の participant が送信元 locator ごとに取りこぼした RTPS パケット数 (シーケンス番号の欠落)。RTPS_SENT と同様に writer の locator に紐付け、LOSS 列の lost と警告 rtps-packets-lost になります。
_fastdds_statistics_resent_datas_fastdds_statistics_heartbeat_count_fastdds_statistics_gap_count writer ごとの再送 DATA、HEARTBEAT、GAP の数。resentLOSS 列のもう一方で、3 つとも JSON の measured.reliability に入ります。
_fastdds_statistics_acknack_count_fastdds_statistics_nackfrag_count reader ごとの ACKNACK と NACKFRAG の数 (欠けたデータや断片を要求した回数)。JSON の measured.reliability
_fastdds_statistics_data_count 各 writer が transport 経由で送った DATA/DATA_FRAG サブメッセージ数。zero-copy 配送では増えないので、増えるかどうかで data-sharing が本当に使われたかが決まります (data-sharing.ja.md を参照)。

観測対象ノードで statistics を有効にする

コードの変更は不要です。Fast DDS は participant 作成時に環境変数を読みます。

export FASTDDS_STATISTICS="RTPS_SENT_TOPIC;RTPS_LOST_TOPIC;HISTORY_LATENCY_TOPIC;PHYSICAL_DATA_TOPIC;DATA_COUNT_TOPIC;PUBLICATION_THROUGHPUT_TOPIC;RESENT_DATAS_TOPIC;HEARTBEAT_COUNT_TOPIC;ACKNACK_COUNT_TOPIC;NACKFRAG_COUNT_TOPIC;GAP_COUNT_TOPIC"

qos-incompatible と判定したペアは実測しません。それでも HISTORY_LATENCY が配送を証明した場合は 警告 qos-incompatible-but-delivered でマッチング規則の穴を知らせます。 writer がこれ無しで起動されたペアには警告 stats-not-enabled-on-writer が付きます (statistics の 無い reader は警告されません)。

カウンタが表すもの

RTPS_SENT のカウンタは writer の participant の起動からの累積です。ツールは観測中ずっと statistics の reader を読み続け、最初と最後のサンプルの 差分packets / bytes として表示します (measured=SHM 148pkt 7.63 MB)。累積値は JSON の packets_total / bytes_total に残ります。 measured の transport の種類は報告されたすべてのパケットから決めるので、以前は流れていたが観測中は 静かだったペアは、実測 transport を失わずに measured=SHM (idle) と表示されます。このセルの他の値: n/a (writer の participant が statistics を出していない)、none (statistics はあるが reader のどの locator にもパケットが無い)、none(delivered) (同じ状況で HISTORY_LATENCY が配送を証明している)。

粒度

statistics は participant 単位 (ROS ノードごとに 1 つ) なので、測定値は writer のノード → reader のノードのリンクに対するものです。個々のペアを区別するのは discovery による予測の方です。 --stats はカウンタが溜まるように --timeout の間ずっと観測します (既定 5 秒。静穏期間による 早期終了は無効)。トラフィックの無いトピックには !no-traffic-observed が付きます。HISTORY_LATENCY が配送を証明しているのに RTPS_SENT に reader のどの locator の項目も無い場合は、代わりに !delivered-without-measured-traffic が付きます。サンプルは届いたが statistics がパケットを 帰属させなかったということです (遅いマシンで 2 MB のサンプルを既定の 512 KB セグメントの SHM で 流したときに見られました。SHM transport descriptor の segment_size を大きくすると改善します)。

落とし穴: 10 インスタンスの上限

Fast DDS 2.14 は statistics の DataWriter を既定のリソース上限 (10 インスタンス) で作ります。 RTPS_SENT は宛先 locator ごとにキーが付くので、10 を超える locator と通信するノード (相手が 数個あれば足ります。相手ごとに metatraffic、ユーザーデータ、SHM の locator があるため) は、 超過分を黙って報告しなくなります。ツールはこれを !stats-writer-instance-limit-suspected で 示します。

同梱のプロファイルで観測対象ノードの上限を外してください。Fast DDS は FASTDDS_STATISTICS に渡した 別名と同じ名前の data_writer プロファイルを適用します。ファイルにはキー付きの各トピックの分が あります (PHYSICAL_DATA はインスタンスが 1 つなので不要)。

export FASTRTPS_DEFAULT_PROFILES_FILE=$(ros2 pkg prefix fastdds_transport_viz)/share/fastdds_transport_viz/config/statistics.xml
export FASTDDS_STATISTICS="RTPS_SENT_TOPIC;RTPS_LOST_TOPIC;HISTORY_LATENCY_TOPIC;PHYSICAL_DATA_TOPIC;DATA_COUNT_TOPIC;PUBLICATION_THROUGHPUT_TOPIC;RESENT_DATAS_TOPIC;HEARTBEAT_COUNT_TOPIC;ACKNACK_COUNT_TOPIC;NACKFRAG_COUNT_TOPIC;GAP_COUNT_TOPIC"

Fast DDS はプロファイルファイルを 1 つしか読みません。data-sharing を --stats で観測するときは、 このファイルと datasharing_auto.xml を結合した datasharing_auto_stats.xml を使います。 (ツール自身の statistics reader は最初からインスタンス数無制限です。)

実装メモ

  • ツールは participant を作る前に自分の環境から FASTDDS_STATISTICS を取り除きます。設定された ままだと Fast DDS 2.14 はツールの statistics reader を載せた participant にも statistics writer を 追加し、reader が acknack を送る途中の on_rtps_sent() 内でデッドロックすることがあります。 ツール自身の statistics は不要です (自身のエンドポイントは除外されます)。
  • RTPS_SENT の送信元は participant の GUID で、byte_count は単純な累積バイト数です (byte_magnitude_orderfloor(log10(byte_count)) にすぎません)。
  • Fast DDS はツールと同じホストにいる participant の locator を 127.0.0.1 に変換して見せます (localhost 変換) が、別ホストの writer の RTPS_SENT はその participant の実アドレス宛ての トラフィックを報告します。そのため重ね合わせでは、loopback の reader locator を同じポートの ツールのホストの任意のアドレスと同一視します。これが無いと、reader がツールと同じホストにいる ホスト間ペアは delivered-without-measured-traffic になっていました。
  • statistics トピックの型サポート生成コードは同梱しています (Apache-2.0)。ROS ディストリビューション はコンパイル済みの型を Fast DDS ライブラリに含めていますが、ヘッダも fastddsgen も配布して いないためです。src/fastdds_transport_viz/third_party/fastdds_statistics_types/ (Fast DDS 2.14.6、Jazzy) と .../fastdds_statistics_types_v3/ (Fast DDS 3.2.4、Kilted / Rolling) があり、 CMake が Fast DDS のメジャーバージョンで選びます。別の Fast DDS を対象にするときは該当ディレクトリ を差し替えてください。