Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 07 章: ACL / CoPP / Mirror を参照。
裏取りステータス: Code-verified(命名差分あり)
現行 master で実装を確認: sonic-swss/orchagent/aclorch.cpp に COUNTERS_ACL_COUNTER_RULE_MAP 定義 (L45)、ACL_COUNTER_DEFAULT_POLLING_INTERVAL_MS=10000, ACL_COUNTER_FLEX_COUNTER_GROUP 経由の登録 (L4209)、SAI ACL counter 属性マッピング (L517-518)、CRM 連動 (L1940/L1982)。sonic-utilities/counterpoll/main.py に counterpoll acl グループと acl interval/enable/disable (L361-)、sonic-utilities/scripts/aclshow も存在。sonic-buildimage/src/sonic-yang-models/yang-models/sonic-flex_counter.yang L363 に container ACL(コメントで ACL_STAT_COUNTER_FLEX_COUNTER_GROUP を明示)。HLD で言及される m_acl_fc_mgr メンバ名は実装上は generic な m_flex_counter_manager (verified at: 2026-05-09)。
ACL カウンタの flex counter 化(ACL_COUNTER + COUNTERS_ACL_COUNTER_RULE_MAP)¶
これは何か(一行で)¶
ACL ルール per packet/byte counter の polling を orchagent から syncd の flex counter へ移譲 し、polling 間隔を counterpoll CLI で制御できるようにする1。
なぜ移譲したか¶
ACL counter は当初 orchagent が 10 秒固定間隔で polling していた。orchagent はシングルスレッドなので、ルール数が増えると main loop を counter 取得で長時間専有し、他タスクの応答が遅延する。port / PG / queue / watermark で既に使われている flex counter インフラ に乗せれば polling は syncd の専用スレッドが担う1。
要件1:
- 大量 ACL rule で orchagent の queue を空ける
- ユーザ設定 +
counterpollCLI で enable/disable - polling interval を 1〜1000 秒 で変更可能
SAI レベル¶
ACL counter は SAI_OBJECT_TYPE_ACL_COUNTER という独立オブジェクトで、SAI_OBJECT_TYPE_ACL_ENTRY に bind される1:
| SAI 属性 | 用途 |
|---|---|
SAI_ACL_COUNTER_ATTR_PACKETS |
packet 数 |
SAI_ACL_COUNTER_ATTR_BYTES |
byte 数 |
ACL rule が動的に生成・削除されるため、flex counter manager は 動的 register / de-register に対応する。
orchagent¶
AclOrch に FlexCounterManager(HLD では m_acl_fc_mgr、実装は generic な m_flex_counter_manager)を持つ。StatsMode::READ、初期 polling 間隔 10 秒、default enable1。flex_counter_manager.h に CounterType::ACL_COUNTER を新設1。
COUNTERS_DB¶
counter 値は OID 単位:
127.0.0.1:6379[2]> hgetall COUNTERS:oid:0x100000000037a
1) "SAI_ACL_COUNTER_ATTR_PACKETS" 2) "100"
3) "SAI_ACL_COUNTER_ATTR_BYTES" 4) "102400"
CLI から「テーブル名×ルール名」で引くために専用マップを置く1:
COUNTERS_ACL_COUNTER_RULE_MAP
key = "<ACL_TABLE_NAME>:<ACL_RULE_NAME>" # 例: "L3_TABLE:RULE0"
value = ACL counter の VID # 例: "oid:0x100000000037a"
create / delete フロー¶
sequenceDiagram
participant App as user / acl-loader
participant CDB as CONFIG_DB
participant AO as AclOrch
participant FCM as FlexCounterManager
participant SYNCD as syncd FlexCounter
participant SAI
participant CNT as COUNTERS_DB
App->>CDB: ACL_RULE 追加
CDB->>AO: notify
AO->>SAI: create SAI_ACL_ENTRY
AO->>SAI: create SAI_ACL_COUNTER, bind
AO->>FCM: register VID with "TBL:RULE"
FCM->>CNT: COUNTERS_ACL_COUNTER_RULE_MAP[TBL:RULE] = oid
FCM->>SYNCD: FLEX_COUNTER:ACL に oid 追加
loop poll
SYNCD->>SAI: get PACKETS/BYTES
SYNCD->>CNT: COUNTERS:oid:<vid>
end
エラー時は best-effort で rollback(作成済みオブジェクト削除 + m_toSync から該当タスクを除去)して syslog にログ1。
mirror rule の特別扱い¶
mirror session が deactivate されると ACL rule 側も削除される。そのまま counter も削除すると session 再 activate 時に counter が 0 にリセット されるため、ユーザ視点で値が飛ぶ。解1:
- counter は削除しない。session deactivate 時には ACL entry からの bind だけ外す
- session 再 activate で entry を作り直し、同じ counter object を再 attach
sequenceDiagram
participant Sess as mirror session
participant AO as AclOrch
participant SAI
Sess-->>AO: deactivate
AO->>SAI: ACL_ENTRY 削除(counter 維持)
Sess-->>AO: activate
AO->>SAI: ACL_ENTRY 再作成
AO->>SAI: 既存 ACL_COUNTER 再 bind
session フラップ間で counter 値が保たれる。
CLI¶
| Command | 用途 |
|---|---|
counterpoll acl enable |
ACL counter polling を有効化 |
counterpoll acl disable |
polling 無効化(ASIC の counter 自体は残る) |
counterpoll acl interval <ms> |
polling 間隔(1〜1000 秒)を変更 |
aclshow [-a] |
rule ごとの packet / byte 表示 |
sonic-clear acl |
counter クリア(ユーザごとの dump 差分方式) |
aclshow の例外処理1:
- map に entry なし →
N/A(counter 未作成 / map 未書込) - map に VID あるが COUNTERS_DB に値なし →
N/A(polling 無効 / syncd 未書込)
sonic-clear acl は /home/admin 配下にダンプを書き、次回 aclshow 実行時にダンプ差分を表示する ユーザごとの clear 状態 方式(他 counter group と共通)1。
admin@sonic:~$ aclshow -a
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
RULE_1 DATAACL 9999 101 100
設定¶
CONFIG_DB¶
COUNTERS_DB¶
| Table | Key | 説明 |
|---|---|---|
COUNTERS:oid:<vid> |
hash | SAI_ACL_COUNTER_ATTR_PACKETS/BYTES |
COUNTERS_ACL_COUNTER_RULE_MAP |
<table>:<rule> |
ACL counter VID マップ |
YANG¶
sonic-flex-counter に ACL group が追加される1:
HLD 当時 YANG に POLL_INTERVAL 未定義1。
syncd¶
syncd/FlexCounter.cpp に ACL group のサポートを追加1。既存 group と同様、別スレッドで間隔ベース polling。
設定例¶
制限事項¶
- HLD 本文に
Restrictions/Limitations: N/A1 と明記。ただし Open Items として: - counter 削除なし設計で、動的 ACL rule 規模が大きいほど COUNTERS_DB の VID 残量が増える
干渉する機能¶
AclOrch:FlexCounterManagerを持ち register/de-register を担うsyncd FlexCounter: ACL group 追加で polling 対象が増える- mirror session 管理: counter を残す特別扱いを誘発
counterpollCLI: ACL group が追加- warm boot / fast boot: 起動時に counter polling が遅延する1
トラブルシューティング¶
aclshowでN/A→redis-cli -n 2 hgetall COUNTERS_ACL_COUNTER_RULE_MAPで map 有無を確認- counter が更新されない →
counterpoll showで ACL group の status と interval、FLEX_COUNTER_TABLE|ACLの status を確認 - mirror flap で counter リセット → 「counter detach 方式」が正しく動いているか syslog で確認
確認コマンド例:
# ACL counter / map / poll status をまとめて確認
aclshow -a
counterpoll show | grep -i acl
redis-cli -n 2 hgetall COUNTERS_ACL_COUNTER_RULE_MAP
redis-cli -n 4 hgetall 'FLEX_COUNTER_TABLE|ACL'