Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 04 章: VRF / ECMP / 経路選択 を参照。
裏取りステータス: Code-verified(CLI 実体名差分あり)
sonic-swss/orchagent/intfsorch.cpp で COUNTERS_RIF_NAME_MAP の生成 (L70)、RIF_STAT_COUNTER_FLEX_COUNTER_GROUP 経由の flex counter 登録 (L96, L1573) と generateInterfaceMap() (L1576) を確認。sonic-utilities/clear/main.py の rifcounters (L175) と RIF 統計表示スクリプト sonic-utilities/scripts/intfstat(SAI_ROUTER_INTERFACE_STAT_* 8 種を扱う)を確認。HLD 本文での実体スクリプト名は rifstat ではなく intfstat が現行実装 (verified at: 2026-05-09)。
ルータインタフェース (RIF) カウンタ¶
概要¶
SONiC のポート単位カウンタ(portstat 系)は L2 のフレーム数・バイト数・エラー数を返すが、L3 で観測される ルータインタフェース (RIF) 単位の入出力統計は別経路で取得する必要がある。RIF とは物理ポート上の Router Port、VLAN インタフェース、ポートチャネル上の L3 サブインタフェースなど、SAI が sai_router_interface オブジェクトとして扱うものを指す。
本機能は SAI の SAI_ROUTER_INTERFACE_STAT_* カウンタを flex counter で定期取得 し、COUNTERS_DB に集約したうえで、show interfaces counters rif CLI から RX/TX のパケット・バイト・エラーを表示できるようにするものである1。
動作仕様¶
データ経路¶
flowchart LR
SAI[SAI\nsai_get_router_interface_stats] -->|polling| FC["Flex Counter\n(RIF FC group, default 1s)"]
FC --> CDB[(COUNTERS_DB)]
CDB -->|COUNTERS:rif_vid\nCOUNTERS_RIF_NAME_MAP\nCOUNTERS_RIF_TYPE_MAP| CLI[show interfaces counters rif]
SWSS[IntfsOrch] -.->|"RIF 追加/削除を FC に登録\nMAP 更新"| CDB
要点は次の 3 点。
- 取得元は SAI
sai_router_interface_api -> sai_get_router_interface_stats()。 - 集約器は flex counter の RIF 専用グループで、デフォルトインターバルはポートカウンタと同じ 1 秒 に揃える1。
IntfsOrchが RIF オブジェクト生成・破棄時に flex counter への登録/解除と、COUNTERS_RIF_NAME_MAP/COUNTERS_RIF_TYPE_MAPの更新を行う。
COUNTERS_DB スキーマ¶
各 RIF VID に対応するエントリで、以下 8 個のカウンタが格納される1。
| キー | カウンタ |
|---|---|
COUNTERS:rif_vid |
SAI_ROUTER_INTERFACE_STAT_IN_PACKETS |
SAI_ROUTER_INTERFACE_STAT_IN_OCTETS |
|
SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS |
|
SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS |
|
SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS |
|
SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS |
|
SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS |
|
SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS |
加えて以下のマッピングが追加される。
| マップ | 用途 |
|---|---|
COUNTERS_RIF_NAME_MAP |
RIF OID ↔ RIF 名(例: Ethernet0, Vlan2, Portchannel0002) |
COUNTERS_RIF_TYPE_MAP |
RIF OID ↔ 種別(LAG / Vlan 等) |
VID ベースの COUNTERS テーブルだけでは人間に読みにくいため、CLI 側はこのマップを介して RIF 名で参照する。
レート計算¶
-p / --period オプションで指定された秒数 delta をもとに、CLI 側で次の式により BPS / PPS を算出する1。
BPS は値域に応じて MB/s / KB/s / B/s で表示する。-p を指定しない呼び出しでは BPS / PPS 列は N/A で出力される。
📋 検証エビデンス: sonic-net/SONiC/doc/rif-counters/RIF_counters.md#L70-L78 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/rif-counters/RIF_counters.md#L70-L78 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
BPS = (new_*_OCTETS - old_*_OCTETS) / delta,
Where delta is the period specified. The BPS is printed in MB/s, KB/s or B/s depending on the value.
PPS = (new_*_PACKETS - old_*_PACKETS) / delta
判断根拠: BPS / PPS の計算式と表示形式の根拠。
Telemetry 経由の参照¶
sonic-telemetry 経由でも参照できる。スキーマ直叩きでは VID をキーとするため、HLD は virtual path 経由の参照を推奨している1。
| DB target | Virtual Path | 意味 |
|---|---|---|
COUNTERS_DB |
RIF_COUNTERS/<interface_name> |
単一 RIF の全カウンタ |
COUNTERS_DB |
RIF_COUNTERS/*/<counter_name> |
全 RIF の単一カウンタ |
COUNTERS_DB |
RIF_COUNTERS/<interface>/<counter> |
単一 RIF の単一カウンタ |
設定¶
関連する CONFIG_DB¶
HLD には専用の CONFIG_DB エントリは記載されていない。flex counter のインターバル変更等は既存の FLEX_COUNTER_TABLE 経路で行うと推測されるが本 HLD のスコープ外(実装裏取りが必要)。
関連する CLI¶
| Command | 用途 |
|---|---|
show interfaces counters rif [-p PERIOD] [--verbose] [<interface>] |
RIF カウンタを一覧 / 単体表示 |
sonic-clear interface rifcounters [<interface>] |
RIF カウンタをクリア(単体または全体) |
表示例¶
引数なしの場合は全 RIF を表形式で表示1。
IFACE RX_OK RX_BPS RX_PPS RX_ERR TX_OK TX_BPS Tx_PPS TX_ERR
----------- ------- -------- -------- ------ ------- -------- -------- --------
Ethernet0 2180 N/A N/A 0 44697 N/A N/A 0
Portchannel0002 2833 N/A N/A 0 0 N/A N/A 0
Vlan2 2833 N/A N/A 0 4170 N/A N/A 0
インタフェース名を指定するとデバッグ向けの整形出力になる。
Portchannel0002
---------------
RX:
0 packets
0 bytes
0 error packets
0 error bytes
TX:
0 packets
0 bytes
0 error packets
0 error bytes
COUNTERS_RIF_NAME_MAP に存在しない名前を渡した場合は警告メッセージを出すと HLD は記載している1。
干渉する機能¶
- portstat: 別系統。
SAI_PORT_STAT_*カウンタを使い、L2 視点のドロップやエラーを返す。RIF カウンタはあくまで L3 視点であり、両者を合算した値ではない。 Port_illegal_packets_drop_design(Interface MIB): SNMP 側では RIF カウンタは独立エントリではなく、対応する物理ポートの Interface MIB に 集約 されて返る。RIF カウンタが MIB と CLI で独立しているのは仕様上正しい。- flex counter インターバル: ポートカウンタと同じ既定 1 秒。負荷増を懸念する場合はインターバルを長くする運用が考えられる。
トラブルシューティング¶
show interfaces counters rifがインタフェースを 1 つも表示しない場合、COUNTERS_RIF_NAME_MAPの存在をredis-cli -n 2 keys 'COUNTERS_RIF*'等で確認する。IntfsOrchがマップを生成しているはず。- 値がすべてゼロ / 動かない場合、当該プラットフォームの SAI が
SAI_ROUTER_INTERFACE_STAT_*を実装していない可能性がある。HLD は SAI 必須カウンタを列挙しているが、ベンダー実装が揃っているとは限らない。 - 特定 RIF の VID と名前の対応を確認するには
COUNTERS_RIF_NAME_MAPを redis から直接読む。
コマンド例¶
router interface (L3) のカウンタを確認する。
制限事項¶
- counter は SAI の per-RIF counter を polling で取得しており、polling 間隔より短いバースト trafic は反映が遅れる。
- ASIC が per-RIF counter を持たない platform では本機能は no-op となり、
show interfaces counters rifが常に 0 になる。 - multi-asic chassis では namespace ごとに counter 表示が分かれるため、全 fabric を見たい場合は集約スクリプトが必要。
既知の問題¶
IP アドレス削除・再追加後に RIF カウンターが機能しない(#729)¶
ルーターインターフェースの IP アドレスを削除してから再追加した場合、show interfaces counters rif の対象カウンターが正常に動作しなくなるケースが報告されている。
原因: IP アドレス削除時に FLEX_COUNTER_TABLE と COUNTERS テーブルの ObjectId に不整合が生じる。
影響バージョン: 201911(master / 202012 では修正済み)
回避策(201911 限定):
VLAN サブインターフェース(dot1q tagged)での ARP 学習問題(#109)¶
Mellanox プラットフォームで VLAN サブインターフェース(dot1q tagged)を使用した場合、ARP が学習されないケースが報告されている。L3 VLAN インターフェースが ASIC に正しく同期されていないことが原因と考えられる。
デバッグ方法:
# VLAN と物理インターフェースの ASIC レベルマッピング確認(Broadcom)
bcmcmd 'l2 show'
# orchagent ログのエラー確認
grep -i error /var/log/swss/sairedis.rec | tail -20