한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 Lag 白皮書 › L6 伺服器網路卡

Ring buffer 不足 RX ring buffer overflow

原因 ID nic-ring · 主要負責 基礎設施團隊(伺服器基礎設施)

在含圖解與實驗的完整版中開啟卡片 →

NIC 暫存封包的 ring buffer 太小時,封包瞬間湧入就會讓緩衝區滿溢而被丟棄。

為什麼 ring buffer 仍是預設值(依驅動程式為 256~2,048 個 slot),容量偏小 → 於是 突發流量來時,CPU 還沒取走封包,緩衝區就滿了 → 畫面上 只在突發流量的瞬間出現封包遺失(瞬移、技能被吃)。遊戲伺服器 log 中看不到任何痕跡

症狀
瞬移, 吃指令/回檔
因素
遺失
誰會遇到
整個伺服器
何時
人潮湧入時
負責單位
主要負責 基礎設施團隊(伺服器基礎設施)
基礎設施團隊要做的事
加大 ring buffer(ethtool -G),監看丟棄(drop)計數器(ethtool -S 的 rx_missed_errors 等,名稱依驅動程式而異)。
數值參考
每秒湧入 100 萬個封包時,1,024 個 slot 約 1ms 就會填滿。這段期間 CPU 只要晚來一次就會滿溢。大部分 NIC 可以加大到數千個。
圖表上
偶爾隨機飆高 · NIC 接收丟棄計數器
查看位置
以短間隔收集 ethtool -S 的接收丟棄計數器(rx_missed_errors、rx_fifo_errors 等,名稱依驅動程式而異)與 ip -s -s link 的 missed,並用 ethtool -g 確認目前的 ring 大小與最大值
符合的跡象
突發流量的瞬間丟棄計數器增加,目前的 ring 大小遠小於最大值。加大 ring 後丟棄減少
不符合的跡象
丟棄計數器沒有變化卻仍有封包遺失時,問題在 kernel 的下一個階段(「Kernel socket 緩衝區不足」)或網路區段。單一核心的 %soft 達到 100% 時是「NIC 中斷集中在單一核心」
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
    e1000 接收描述子(ring slot)預設 256 個,最多可加大到 4,096 個
  2. drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
    ice 驅動程式接收描述子預設 2,048 個,最多 8,160 個
  3. Interface statistics Linux kernel
    緩衝區不足、被裝置丟棄的封包計入 rx_missed_errors,各驅動程式的統計用 ethtool -S 確認
  4. ethtool(8) — Linux manual page ethtool
    -g 確認 ring 大小(目前值、最大值),-G 修改,-S 查看各驅動程式的統計

相關原因

同一層:L6 伺服器網路卡

同一症狀(瞬移)在其他層的原因

查看含圖解與實驗的完整版卡片