遊戲 Lag 白皮書 › TCP 重傳的根本原因
接收端伺服器主機丟棄封包 Receiver host drops (ring, softirq, CPU)
原因 ID rt-host-drop · 主要負責 基礎設施團隊(伺服器基礎設施)
在含圖解與實驗的完整版中開啟卡片 →
封包已經到了伺服器,卻因 NIC 的 ring buffer(暫存剛抵達封包的緩衝區)溢位,或 kernel 負責接收處理的 CPU 核心滿載而被丟棄。
為什麼 連線人數暴增、中斷集中在單一核心、虛擬機器 CPU steal、虛擬交換器過載 → 於是 在 ring buffer(rx_missed_errors 等,名稱依驅動程式而異)或 kernel 接收佇列(softnet dropped)被丟棄 → 畫面上 人潮湧入時,整個伺服器同時出現輸入慢半拍才生效、頓一下
- 症狀
- 輸入延遲, 定格, 快轉, 瞬移
- 因素
- 遺失, 停滯
- 誰會遇到
- 整個伺服器
- 何時
- 人潮湧入時
- 負責單位
- 主要負責 基礎設施團隊(伺服器基礎設施)
- 基礎設施團隊要做的事
- 把 ethtool -S 的 rx_missed_errors 這類丟棄計數器與 /proc/net/softnet_stat 的 dropped 加入監控、加大 ring buffer(ethtool -G)、把 RSS 與中斷分散到多個核心、把遊戲執行緒與接收處理核心分開、確保 CPU 有餘裕、虛擬機器則檢查 CPU steal 與虛擬交換器負載。
- 數值參考
- 伺服器在接收時丟棄的封包,會由用戶端重送。因此伺服器的重傳指標不太會反映出來,會先出現在 ethtool -S 的 rx_missed_errors 這類丟棄計數器(名稱依驅動程式而異)與 /proc/net/softnet_stat 的 dropped。
- 圖表上
- 碰到上限後持平 · 各核心的 softirq 使用率、NIC 丟棄計數器
- 查看位置
- 查看 ethtool -S 的丟棄計數器(rx_missed_errors 等,mlx5 為 rx_out_of_buffer、rx_discards_phy)、ip -s -s link 的 missed、/proc/net/softnet_stat 的第 2 欄(dropped)與第 3 欄(time_squeeze),並用 mpstat -P ALL 查看各核心的 %soft(軟體中斷處理)。虛擬機器也要看 %steal
- 符合的跡象
- 人潮湧入時丟棄計數器或 softnet dropped 增加,負責接收處理的核心 %soft 接近 100% 而無法再往上。該伺服器的所有連線同時出現輸入變慢
- 不符合的跡象
- 伺服器的丟棄計數器沒有變化,重傳集中在特定地區或電信業者的連線時,是路徑上的遺失。伺服器送出的封包在路徑上遺失時,伺服器 nstat 的 TcpRetransSegs 會增加,這些計數器則維持不變
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
出處
- Interface statistics Linux kernel
rx_missed_errors 是因沒有緩衝區而主機沒能接收的封包數(在 /proc/net/dev 中計入 drop),可用 ip -s -s link 確認 - drivers/net/ethernet/intel/igb/igb_ethtool.c Linux kernel
ethtool -S 的計數器名稱由驅動程式決定(例:igb 的 rx_missed_errors、rx_no_buffer_count) - Ethtool counters Linux kernel
mlx5 驅動程式的 rx_out_of_buffer(接收佇列沒有緩衝區)、rx_discards_phy(因 port 緩衝區不足而丟棄) - net/core/net-procfs.c Linux kernel
/proc/net/softnet_stat 每個 CPU 一行,以 16 進位表示,第 2 欄是 dropped,第 3 欄是 time_squeeze - Documentation for /proc/sys/net/ Linux kernel
netdev_max_backlog:封包進來的速度比 kernel 處理得快時,用來暫存的接收佇列上限 - Scaling in the Linux Networking Stack Linux kernel
RSS:NIC 把流量分到多個接收佇列,由多顆 CPU 處理 - ethtool(8) — Linux manual page ethtool
用 -G(--set-ring)變更 ring buffer 大小 - proc_stat(5) — Linux manual page Linux man-pages
/proc/stat 的 steal:在虛擬化環境中,其他 OS 使用 CPU 的時間 - mpstat(1) — Linux manual page sysstat
用 mpstat -P ALL 查看各核心使用率,%soft 是處理軟體中斷的時間,%steal 是 hypervisor 忙著處理其他虛擬 CPU 而等待的時間 - net/ipv4/proc.c Linux kernel
nstat 顯示的 TcpRetransSegs(Tcp 項目下的 RetransSegs)
相關原因
同一層:TCP 重傳的根本原因
同一症狀(輸入延遲)在其他層的原因
查看含圖解與實驗的完整版卡片