QUEUE_COUNTER_CAPABILITIES (STATE_DB)¶
概要¶
STATE_DB の QUEUE_COUNTER_CAPABILITIES テーブルは、sonic-swss の portsorch が orchagent 起動時に SAI ケイパビリティクエリ(sai_query_stats_capability)を実行した結果を書き込む読み取り専用テーブルである1。
書き込まれるフィールドは WRED/ECN キューカウンタ 4 種のサポート可否フラグ(isSupported: "true"/"false")のみ。wredstat スクリプトおよび portstat.py がこのフラグを参照して、未サポートの ASIC では COUNTERS_DB から対応フィールドを除外する。
CONFIG_DB との関係
QUEUE_COUNTER_CAPABILITIES は STATE_DB の読み取り専用テーブルであり、CONFIG_DB には対応する設定テーブルが存在しない。WRED/ECN カウンタの有効化は FLEX_COUNTER_TABLE|WRED_ECN_QUEUE の FLEX_COUNTER_STATUS で行うが、ASIC が対応していない場合はフラグが "false" のまま残る。
データフロー¶
flowchart LR
SAI["SAI<br/>sai_query_stats_capability()"]
OA["portsorch<br/>(orchagent)"]
STATE[("STATE_DB<br/>QUEUE_COUNTER_CAPABILITIES")]
UTIL["wredstat / portstat"]
OA -->|"起動時 initCounterCapabilities()"| SAI
SAI -->|"SAI_OBJECT_TYPE_QUEUE ケイパビリティ結果"| OA
OA -->|"isSupported = true/false"| STATE
STATE -->|"フラグ参照(不要カウンタを除外)"| UTIL
key 構造¶
現在定義されているキー(portsorch.cpp:1872-1875):
| キー | 対応 SAI 統計 |
|---|---|
WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER |
SAI_QUEUE_STAT_WRED_ECN_MARKED_PACKETS |
WRED_ECN_QUEUE_ECN_MARKED_BYTE_COUNTER |
SAI_QUEUE_STAT_WRED_ECN_MARKED_BYTES |
WRED_ECN_QUEUE_WRED_DROPPED_PKT_COUNTER |
SAI_QUEUE_STAT_WRED_DROPPED_PACKETS |
WRED_ECN_QUEUE_WRED_DROPPED_BYTE_COUNTER |
SAI_QUEUE_STAT_WRED_DROPPED_BYTES |
フィールド一覧¶
各キーに対して 1 フィールドのみ存在する:
| フィールド | 型 | 書込み主体 | デフォルト | 説明 |
|---|---|---|---|---|
isSupported |
boolean string | portsorch (initCounterCapabilities) |
"false" |
ASIC が当該 WRED/ECN カウンタをサポートする場合 "true"、未サポートの場合 "false" |
書き込みロジック詳細¶
portsorch.cpp:1850-1918 の initCounterCapabilities() が switchId を引数に起動直後 1 回だけ呼ばれる:
- 初期化フェーズ: 4 つの全キーに
isSupported = "false"を書き込む(デフォルト) - SAI クエリフェーズ:
sai_query_stats_capability(switchId, SAI_OBJECT_TYPE_QUEUE, &queue_stats_capability)を実行 - 更新フェーズ: クエリが
SAI_STATUS_SUCCESSを返した場合のみ、対応する統計を含む行があればisSupported = "true"に上書き - 失敗時:
SAI_STATUS_SUCCESS以外(SAI_STATUS_BUFFER_OVERFLOWリトライ失敗含む)では全フラグが"false"のまま
// portsorch.cpp:1871-1913
m_queueCounterCapabilitiesTable->set("WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER", fieldValuesFalse);
m_queueCounterCapabilitiesTable->set("WRED_ECN_QUEUE_ECN_MARKED_BYTE_COUNTER", fieldValuesFalse);
m_queueCounterCapabilitiesTable->set("WRED_ECN_QUEUE_WRED_DROPPED_PKT_COUNTER", fieldValuesFalse);
m_queueCounterCapabilitiesTable->set("WRED_ECN_QUEUE_WRED_DROPPED_BYTE_COUNTER", fieldValuesFalse);
// ... sai_query_stats_capability() ...
if (SAI_QUEUE_STAT_WRED_ECN_MARKED_PACKETS == queue_stats_capability.list[it].stat_enum)
m_queueCounterCapabilitiesTable->set("WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER", fieldValuesTrue);
// ... (4 統計すべて同様)
消費者 (consumer)¶
| プロセス | 参照方法 | 用途 |
|---|---|---|
sonic-utilities/utilities_common/portstat.py |
STATE_DB QUEUE_COUNTER_CAPABILITIES|... の isSupported フィールドを直接 GET |
portstat が COUNTERS_DB から取得するカウンタ列を絞り込む |
sonic-utilities/scripts/wredstat |
state_db.connect(STATE_DB) 後に参照 |
wredstat が N/A 表示 vs 実値表示を制御 |
sonic-utilities/counterpoll/main.py |
間接的(FLEX_COUNTER_TABLE | WRED_ECN_QUEUE 経由) |
フィールド暗黙デフォルト (Phase A — コード由来)¶
YANG schema は存在しない。すべてのデフォルトは portsorch.cpp のコードに由来する。
| フィールド / キー | コード由来デフォルト | fallback 源 |
|---|---|---|
WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER.isSupported |
"false" |
portsorch.cpp:1872 — initCounterCapabilities() が set 前に必ず "false" で初期化 |
WRED_ECN_QUEUE_ECN_MARKED_BYTE_COUNTER.isSupported |
"false" |
portsorch.cpp:1873 — 同上 |
WRED_ECN_QUEUE_WRED_DROPPED_PKT_COUNTER.isSupported |
"false" |
portsorch.cpp:1874 — 同上 |
WRED_ECN_QUEUE_WRED_DROPPED_BYTE_COUNTER.isSupported |
"false" |
portsorch.cpp:1875 — 同上 |
補足¶
- 全デフォルトは
"false": ASIC が WRED/ECN 統計をまったくサポートしない環境では、4 フィールド全てが"false"のままとなる。wredstatは N/A を表示し、counterpoll の WRED_ECN_QUEUE をenableにしても COUNTERS_DB に対応フィールドが現れない(silent non-addition)。 - orchagent 再起動でリセット:
initCounterCapabilities()は起動のたびに実行される。ただしsai_query_stats_capability()の結果が一貫しているため、再起動ごとに同じフラグが書き込まれる。 - 部分サポートあり: ECN マーキングのみサポートし WRED ドロップはサポートしない ASIC の場合、
WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER/WRED_ECN_QUEUE_ECN_MARKED_BYTE_COUNTERのみ"true"となる(独立したフラグ)。 PORT_COUNTER_CAPABILITIESとの対称性: 同じinitCounterCapabilities()内でポート側のPORT_COUNTER_CAPABILITIESテーブルも同様のパターンで書き込まれる。ポート側はSAI_OBJECT_TYPE_PORTでクエリする。
例外条件・特殊挙動¶
| 条件 | 挙動 |
|---|---|
sai_query_stats_capability() 失敗 |
SWSS_LOG_NOTICE("Queue stat capability get failed: ...") を出力し、4 フィールド全て "false" のまま |
SAI が SAI_STATUS_BUFFER_OVERFLOW を返す |
queue_stats_capability.list をリサイズして再クエリ。再クエリも失敗した場合は上記と同じ |
orchagent 起動前に wredstat を実行 |
STATE_DB に当該キーが存在しないため、state_db.get() が None を返す。wredstat は WRED カウンタを N/A 扱いする |
| FLEX_COUNTER_TABLE | WRED_ECN_QUEUE が disable |
関連リファレンス¶
- CONFIG_DB:
FLEX_COUNTER_TABLE— WRED_ECN_QUEUE グループの enable/disable 設定 - CONFIG_DB:
QUEUE— egress queue ごとの SCHEDULER / WRED_PROFILE 割り当て - CONFIG_DB:
BUFFER_QUEUE— バッファキュー割り当て - COUNTERS_DB:
counters-queue— Queue/PG カウンタテーブル群の詳細
関連リファレンス¶
- CONFIG_DB:
FLEX_COUNTER_TABLE - CONFIG_DB:
QUEUE
引用元¶
運用ヒント¶
STATE_DB 確認コマンド¶
# WRED/ECN キューカウンタのサポート状況を確認
sonic-db-cli STATE_DB keys 'QUEUE_COUNTER_CAPABILITIES|*'
sonic-db-cli STATE_DB hgetall 'QUEUE_COUNTER_CAPABILITIES|WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER'
sonic-db-cli STATE_DB hgetall 'QUEUE_COUNTER_CAPABILITIES|WRED_ECN_QUEUE_WRED_DROPPED_PKT_COUNTER'
# 4 フィールド一括確認(bash ループ)
for key in WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER WRED_ECN_QUEUE_ECN_MARKED_BYTE_COUNTER \
WRED_ECN_QUEUE_WRED_DROPPED_PKT_COUNTER WRED_ECN_QUEUE_WRED_DROPPED_BYTE_COUNTER; do
echo -n "$key: "
sonic-db-cli STATE_DB hget "QUEUE_COUNTER_CAPABILITIES|$key" isSupported
done
# WRED 統計を表示(isSupported が true の場合のみ実値が表示される)
wredstat
よくある確認ポイント¶
isSupportedが"false"のままwredstatを実行しても N/A 表示になる。これは正常動作(ASIC が WRED を SAI でサポートしていない)counterpoll wred-queue enable後も wredstat が N/A の場合、このQUEUE_COUNTER_CAPABILITIESテーブルのフラグを確認する"true"になっているのに wredstat が N/A の場合は FLEX_COUNTER_TABLE|WRED_ECN_QUEUE の STATUS を確認する
-
sonic-swss/orchagent/portsorch.cpp:1850-1918—initCounterCapabilities()実装。SAI ケイパビリティクエリと STATE_DB への書き込みロジック。sonic-swss-common/common/schema.h:528—STATE_QUEUE_COUNTER_CAPABILITIES_NAME "QUEUE_COUNTER_CAPABILITIES"定義。https://github.com/sonic-net/sonic-swss/blob/master/orchagent/portsorch.cpp ↩