BUFFER_POOL テーブル¶
概要¶
ASIC 上の共有 / 専用バッファプールを CONFIG_DB で定義するテーブル。BUFFER_PROFILE.pool から leafref で参照される。bufferorch (orchagent) または buffermgrd (dynamic buffer model) が CONFIG_DB を購読し、SAI BUFFER_POOL に変換する1。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>BUFFER_POOL")]
DM["buffermgrd"]
CDB --> DM
APPDB[("APP_DB<br/>APP_BUFFER_POOL_TABLE")]
DM --> APPDB
SYNCD["syncd"]
APPDB --> SYNCD
SAI["SAI<br/>sai_buffer_api"]
SYNCD --> SAI
凡例
CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。
key 構造¶
慣用名: ingress_lossless_pool、ingress_lossy_pool、egress_lossless_pool、egress_lossy_pool。
主要フィールド¶
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
type |
enum ingress/egress/both |
yes | プールの方向 |
mode |
enum static/dynamic |
yes | 閾値モード |
size |
uint64 (bytes) | no | プールサイズ。percentage と排他 |
xoff |
uint64 (bytes) | no (default 0) | xoff 閾値 (lossless ingress 用) |
percentage |
uint8 | no | 利用可能バッファに対する割合 (dynamic buffer model 限定) |
制約¶
percentageはsizeと同時設定できない (must制約)percentageはDEVICE_METADATA.localhost.buffer_model = 'dynamic'のときのみ有効
購読者¶
- traditional buffer model:
orchagentのBufferOrch - dynamic buffer model:
buffermgrd(docker-swss) が CONFIG_DB → APPL_DB に展開し、bufferorchが SAI 反映 - ベンダ固有のテンプレ (
buffers_*.json.j2) でハードウェア依存初期値が生成される
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
BUFFER_PROFILE、BUFFER_PG、BUFFER_QUEUE、DEVICE_METADATA - 関連 CLI:
config buffer、mmuconfig - 関連 YANG:
sonic-buffer-pool、sonic-buffer-profile
関連リファレンス¶
引用元¶
関連 Topics¶
運用ヒント¶
典型値¶
- key 形式:
BUFFER_POOL|<pool-name>(ingress_lossless_pool/egress_lossless_pool/egress_lossy_pool等)。 size: ASIC 別の SDK 値(例 100G TOR で12766208)。type:ingress/egress。mode:dynamic/static。
よくある誤設定¶
sizeを ASIC 上限超過で入れると bufferorch がSAI_STATUS_NO_MEMORYを返し、すべての buffer 設定が止まる。mode: dynamicを ASIC 未対応のまま使うと PFC で head-of-line を起こす。traditionalプラットフォームではstatic。
確認コマンド¶
値依存挙動マトリクス¶
type (enum: ingress/egress/both)¶
| 値 | SAI 属性 | 備考 |
|---|---|---|
ingress |
SAI_BUFFER_POOL_TYPE_INGRESS |
ingress 方向のみ。xoff 設定は ingress pool でのみ有効 |
egress |
SAI_BUFFER_POOL_TYPE_EGRESS |
egress 方向のみ |
both |
SAI_BUFFER_POOL_TYPE_BOTH |
双方向プール (一部 ASIC のみ) |
bufferorch.cpp:443-453 で SAI API に渡される。
mode (enum: static/dynamic)¶
| 値 | SAI 属性 | 動作モード | percentage フィールド |
|---|---|---|---|
static |
SAI_BUFFER_POOL_THRESHOLD_MODE_STATIC |
size (bytes) で固定閾値 |
無効 |
dynamic |
SAI_BUFFER_POOL_THRESHOLD_MODE_DYNAMIC |
Alpha 値で動的閾値 | 有効 (DEVICE_METADATA.buffer_model=dynamic のとき) |
bufferorch.cpp:474-480 で SAI API に渡される。
type × mode の組み合わせと xoff¶
| type | mode | xoff |
典型 pool 名 |
|---|---|---|---|
ingress |
static |
有効 (lossless 用) | ingress_lossless_pool |
ingress |
dynamic |
無効 | ingress_lossy_pool |
egress |
static |
無効 | egress_lossless_pool |
egress |
dynamic |
無効 | egress_lossy_pool |
例外条件・特殊挙動¶
| 条件 | 挙動 | ソース |
|---|---|---|
xoff フィールドが ingress_lossless_pool 以外のプールに設定 |
Field xoff is supported for %s only を LOG_ERROR → xoff は ignored、他フィールドは処理 |
buffermgrdyn.cpp L2625 |
xoff 値が MMU サイズを超過 |
Invalid xoff %s, exceeding the mmu size を LOG_ERROR → xoff 無視、pool size は更新 |
buffermgrdyn.cpp L757 |
| SHP 設定が変化なし | updated without change, skipped → APPL_DB への書き込みをスキップ |
buffermgrdyn.cpp L2614 |
| 同一 pool に複数の zero profile 登録 | Multiple zero profiles detected for pool %s, takes the former and ignores the latter を LOG_ERROR |
buffermgrdyn.cpp L338 |
| Buffer pools が未準備の状態でプロファイル設定 | pending → プロファイル適用を遅延 |
buffermgrdyn.cpp L894 |
| 共有バッファプールが未設定 | headroom 計算をスキップ (No shared buffer pool configured) |
buffermgrdyn.cpp L684 |
task_invalid_entry (static モード main loop) |
Failed to process invalid entry, drop it → エントリを破棄 |
buffermgr.cpp L585 |
| 既存プロファイルが存在する場合の pool 作成 | // check if profile already exists - if yes - skip creation |
buffermgr.cpp L246 |