遊戲 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 中斷集中在單一核心」
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
出處
- Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
e1000 接收描述子(ring slot)預設 256 個,最多可加大到 4,096 個 - drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
ice 驅動程式接收描述子預設 2,048 個,最多 8,160 個 - Interface statistics Linux kernel
緩衝區不足、被裝置丟棄的封包計入 rx_missed_errors,各驅動程式的統計用 ethtool -S 確認 - ethtool(8) — Linux manual page ethtool
-g 確認 ring 大小(目前值、最大值),-G 修改,-S 查看各驅動程式的統計
相關原因
同一層:L6 伺服器網路卡
同一症狀(瞬移)在其他層的原因
查看含圖解與實驗的完整版卡片