Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 20 章: SWSS / SAI / Redis を参照。
裏取りステータス: code-verified (2026-05-11)
SwitchOrch の packet trimming 取り込みを sonic-swss/orchagent/switchorch.cpp L1004-L1260 で確認。SAI_SWITCH_ATTR_PACKET_TRIM_SIZE (L1004), _DSCP_RESOLUTION_MODE (L1015), _DSCP_VALUE (L1026), _TC_VALUE (L1037), _QUEUE_RESOLUTION_MODE (L1048), _QUEUE_INDEX (L1059) を SAI に書き込む 6 経路を確認。capability エラーハンドリングと symmetric DSCP モード時の TC skip ロジック (L1190 Skip setting switch trimming TC value for symmetric DSCP mode) も実装済み。BufferOrch / ACL DISABLE_TRIMMING 側は別バッチで深堀予定。
Packet Trimming(symmetric / asymmetric DSCP / ACL disable)¶
概要¶
Packet Trimming(PT)はバッファ枯渇で drop されるはずの大きな packet を、L2 + L3/L4 ヘッダ + 先頭 payload N bytes だけ残して NIC(受信側)に届ける SAI 機能。受信側 NIC が再送依頼を高速に出せるため、congestion 復帰が早い1。Nazarii Hnydyn、2024-11 初版。
スコープ:
- global PT 設定 + per-buffer-profile での enable/disable
- ACL の disable trimming action で fine-grained 除外(v0.1 から)
- v0.2: Asymmetric DSCP(trim 後 packet に異なる DSCP を打つ)
- v0.3: Drop counters(trim 数の可視化)
動作仕様¶
Symmetric vs Asymmetric DSCP¶
| Mode | trim 後の DSCP |
|---|---|
| Symmetric | original packet の DSCP をそのまま保持 |
| Asymmetric | global の dscp_value で上書き(受信側で trim と判別しやすい) |
コンポーネント¶
flowchart LR
USER[(CONFIG_DB\nSWITCH_TRIMMING\nBUFFER_PROFILE.packet_trimming\nACL_RULE.action=DISABLE_TRIMMING)] --> SO[SwitchOrch]
USER --> BO[BufferOrch]
USER --> AO[AclOrch]
USER --> QO[QosOrch]
SO -->|switch trim attr| SAI_SW[(SAI switch trimming)]
BO -->|profile trim attr| SAI_BUF[(SAI buffer profile)]
AO -->|disable trim action| SAI_ACL[(SAI ACL entry)]
SO --> CDB[(STATE_DB\nSWITCH_TRIMMING_CAPABILITY)]
FCO[FlexCounterOrch] --> CDB2[(COUNTERS_DB\ntrim drop counter)]
CONFIG_DB¶
SWITCH_TRIMMING|GLOBAL:
size = <bytes> # 残す size
dscp_value = <0..63> # asymmetric の上書き値
dscp_mode = symmetric | asymmetric
queue_index = <queue> # trim 後の egress queue 指定
BUFFER_PROFILE|<name>:
packet_trimming = enabled | disabled
ACL_RULE|<table>|<rule>:
PACKET_ACTION = DISABLE_TRIMMING # ACL マッチ packet は trim 対象外
STATE_DB¶
STATE_DB.SWITCH_TRIMMING_CAPABILITY で ASIC が PT をサポートしているか / supported size 範囲 / asymmetric DSCP 可否を公開1。CLI が事前 check に使う。
動作フロー¶
sequenceDiagram
participant P as ingress packet
participant Q as egress queue (buffer profile)
participant T as SAI trim engine
participant N as 受信 NIC
P->>Q: enqueue
alt buffer 余り
Q->>N: 通常転送
else buffer 枯渇 + profile=enabled + ACL not disabling
Q->>T: drop 直前で trim
T->>N: L2+L3/L4+N bytes (DSCP optional 上書き)
end
Drop counter(v0.3)¶
trim された packet の counter を per-port / per-queue で公開。Flex Counter framework に乗る1。congestion 状況の可視化と運用判断(PT を無効化すべきか)に使う。
Initial / Migration¶
SWITCH_TRIMMING|GLOBAL の初期値はテンプレート提供。db_migrator が旧 image からの up-grade 時に default を入れる1。
📋 検証エビデンス: sonic-net/SONiC/doc/packet_trimming/packet-trimming-design.md#L72-L80 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/packet_trimming/packet-trimming-design.md#L72-L80 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
In scope: Global PT configuration with per buffer profile control
Fine-grained PT control via ACL disable trimming action
判断根拠: スコープと per-buffer + ACL disable の根拠。
設定¶
CLI¶
config switch-trimming size 128
config switch-trimming dscp-value 32 --mode asymmetric
config switch-trimming queue 0
config buffer profile <name> --packet-trimming enabled
config acl rule add <table> <rule> --action DISABLE_TRIMMING
show switch-trimming summary
show switch-trimming counters
制限事項¶
- ASIC が trimming 機能を持つ platform 限定(capability で reject)
- size はハードウェア制約(最小 / 最大)あり
- ACL の
DISABLE_TRIMMINGは他 packet_action と排他になる場合あり(実装依存) - Drop counter は v0.3 から、対応未済 platform は
N/A
干渉する機能¶
- Buffer / PFC: profile ごとに trim を切り替える設計のため、PFC lossless profile では disable が定石
- ACL:
DISABLE_TRIMMINGを使う rule は AclOrch / capabilities と整合が必要 - Flex Counter: drop counter を polling
トラブルシューティング¶
- trim が起きない → buffer profile の
packet_trimming=enabled、ACL で disable していないか確認 - 受信 NIC で trim 判別ができない → asymmetric DSCP 設定で受信側に signal するよう運用
コマンド例: Packet trimming 確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# Packet trimming 設定と適用状態
show switch-trimming global
redis-cli -n 4 hgetall 'SWITCH_TRIMMING|GLOBAL'
show queue counters | grep -i trim
コマンド例: Packet trimming 確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# Packet trimming 設定と適用状態
show switch-trimming global
redis-cli -n 4 hgetall 'SWITCH_TRIMMING|GLOBAL'
show queue counters | grep -i trim
裏取り済み実装位置 (2026-05-11)¶
- Trim size 設定:
sonic-swss/orchagent/switchorch.cppL1004 (SAI_SWITCH_ATTR_PACKET_TRIM_SIZE) - DSCP resolution / value: 同 L1015 (
PACKET_TRIM_DSCP_RESOLUTION_MODE), L1026 (PACKET_TRIM_DSCP_VALUE) - TC value: 同 L1037 (
PACKET_TRIM_TC_VALUE), L1190 で symmetric DSCP 時の skip - Queue resolution / index: 同 L1048 (
PACKET_TRIM_QUEUE_RESOLUTION_MODE), L1059 (PACKET_TRIM_QUEUE_INDEX) - capability チェック&エラーログ: 同 L1083, L1093-L1260 全体(
Switch trimming configuration is not supported: skipping ...ほか)
BufferOrch 側の per-profile trimming と ACL
DISABLE_TRIMMINGaction、SWITCH_TRIMMING_CAPABILITYの STATE_DB 公開は別バッチで深掘り予定。