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

遊戲 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 會增加,這些計數器則維持不變
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. Interface statistics Linux kernel
    rx_missed_errors 是因沒有緩衝區而主機沒能接收的封包數(在 /proc/net/dev 中計入 drop),可用 ip -s -s link 確認
  2. drivers/net/ethernet/intel/igb/igb_ethtool.c Linux kernel
    ethtool -S 的計數器名稱由驅動程式決定(例:igb 的 rx_missed_errors、rx_no_buffer_count)
  3. Ethtool counters Linux kernel
    mlx5 驅動程式的 rx_out_of_buffer(接收佇列沒有緩衝區)、rx_discards_phy(因 port 緩衝區不足而丟棄)
  4. net/core/net-procfs.c Linux kernel
    /proc/net/softnet_stat 每個 CPU 一行,以 16 進位表示,第 2 欄是 dropped,第 3 欄是 time_squeeze
  5. Documentation for /proc/sys/net/ Linux kernel
    netdev_max_backlog:封包進來的速度比 kernel 處理得快時,用來暫存的接收佇列上限
  6. Scaling in the Linux Networking Stack Linux kernel
    RSS:NIC 把流量分到多個接收佇列,由多顆 CPU 處理
  7. ethtool(8) — Linux manual page ethtool
    用 -G(--set-ring)變更 ring buffer 大小
  8. proc_stat(5) — Linux manual page Linux man-pages
    /proc/stat 的 steal:在虛擬化環境中,其他 OS 使用 CPU 的時間
  9. mpstat(1) — Linux manual page sysstat
    用 mpstat -P ALL 查看各核心使用率,%soft 是處理軟體中斷的時間,%steal 是 hypervisor 忙著處理其他虛擬 CPU 而等待的時間
  10. net/ipv4/proc.c Linux kernel
    nstat 顯示的 TcpRetransSegs(Tcp 項目下的 RetransSegs)

相關原因

同一層:TCP 重傳的根本原因

同一症狀(輸入延遲)在其他層的原因

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