Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
sonic-swss/orchagent/port_rates.lua に compute_ber() と SAI_PORT_STAT_IF_IN_FEC_CORRECTED_BITS / SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES の HGET、Pre/Post FEC BER 計算(rs_average_frame_ber 使用)、lanes / serdes_speed lookup を確認。sonic-utilities/scripts/portstat に -f/--fec-stats、-fh/--fec_hist flag を実装済み(verified at: 2026-05-09)。
Port FEC BER(Pre/Post FEC BER の算出と show fec-stat 拡張)¶
なぜこの機能が必要か¶
ポートの FEC(Forward Error Correction)統計 から Pre / Post FEC BER を計算し、show interface counter fec-stat に列を 2 つ追加するとともに、COUNTER_DB の RATES テーブルにも書き込んでテレメトリで取れるようにする1。SAI 側修正は 不要(既存 SAI_PORT_STAT_IF_IN_FEC_* を利用)。
- Pre FEC BER: FEC が訂正できた bit のレート
- Post FEC BER: FEC が訂正失敗したフレームの worst-case BER 推定
PORT_STAT のポーリング周期(1 秒)に乗る。
何をどう計算するか¶
port_rates.lua を拡張し、各ポーリング周期で1:
flowchart LR
PR[port_rates.lua] -->|read| CDB[(COUNTER_DB COUNTERS\nSAI_PORT_STAT_IF_IN_FEC_*)]
PR -->|read| ADB[(APPL_DB PORT_TABLE\nspeed/lanes)]
PR -->|write| RT[(COUNTER_DB RATES\nFEC_PRE_BER / FEC_POST_BER)]
RT --> CLI[portstat -f]
port_data_rate = port_speed / lanes_count
serdes = lookup(port_data_rate) # 1G→1.25e9, 25G→25.78125e9, 100G→106.25e9 ...
interval_s = 1.0
pre_ber = ΔSAI_PORT_STAT_IF_IN_FEC_CORRECTED_BITS
/ (serdes * lanes_count * interval_s)
post_ber = ΔSAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES
* rs_average_frame_ber (1e-8)
/ (serdes * lanes_count * interval_s)
Post BER は「フレーム内全 bit 誤り」最悪ケース + 1e-8 の統計係数で近似1。
関連 SAI カウンタ¶
| Redis | Table | Field |
|---|---|---|
| COUNTER_DB | COUNTERS | SAI_PORT_STAT_IF_IN_FEC_CORRECTED_BITS / ..._NOT_CORRECTABLE_FRAMES |
| COUNTER_DB | RATES | *_last、FEC_PRE_BER、FEC_POST_BER(新規) |
| APPL_DB | PORT_TABLE | lanes、speed |
CLI / 設定例¶
CONFIG_DB / YANG への変更なし。CLI は既存表示の列追加:
show interface counter fec-stat
# IFACE STATE FEC_CORR FEC_UNCORR FEC_SYMBOL_ERR FEC_PRE_BER FEC_POST_BER
# Ethernet0 U 0 0 0 1.48e-20 0.00e+00
portstat -f # 上記と同等のエイリアス
制限事項¶
- SAI 側で対応カウンタが未実装の platform では値が空(HLD で「return not support」と明記)1
- Post FEC BER は worst-case 推定。絶対値比較ではなく時系列トレンド に使う
- serdes lookup は限定セット(1G/10G/25G/50G/100G)。範囲外 data rate は
serdes=0で計算が壊れる1
干渉する機能¶
- port_rates.lua / FlexCounter: 同 lua に乗るためポーリング負荷は他レート計算と共有
- xcvrd / pmon: 物理層異常との相関に有用
- テレメトリ:
RATES経由で gNMI 公開可能
トラブルシューティング¶
redis-cli -n 2 hgetall 'COUNTERS:oid:0x1000000000003' # SAI カウンタ存在
redis-cli -n 2 hgetall 'RATES:Ethernet0' | grep -i fec # FEC_PRE/POST_BER
show interface counter fec-stat
- 空欄 → SAI カウンタ未対応か、speed/lanes が lookup 外
- 値が異常に大きい → serdes 速度 lookup ミスマッチ
- Post BER 常時 0 → uncorrectable frame が本当に 0 か、SAI 取得失敗
関連 Topics¶
- 14-platform-port-optics: port / optics / FEC