実測 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 の数。resent は LOSS 列のもう一方で、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_orderはfloor(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 を対象にするときは該当ディレクトリ を差し替えてください。