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

遊戲 Lag 白皮書 › L10 記憶體

Swap Swapping

原因 ID mem-swap · 主要負責 基礎設施團隊(伺服器基礎設施) · 協同 遊戲開發團隊(伺服器開發)

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

記憶體不足、OS 把部分內容移到磁碟後,每次用到那塊記憶體,都得等待慢上 1,000 倍以上的磁碟。

為什麼 使用中的記憶體超過實體 RAM → 於是 OS 把一部分移到磁碟,需要時再讀回來 → 畫面上 tick 暴增到數百 ms,伺服器上所有玩家都遇到慢動作與定格

症狀
慢動作, 定格
因素
停滯
誰會遇到
整個伺服器
何時
開越久越嚴重, 晚間尖峰時段
負責單位
主要負責 基礎設施團隊(伺服器基礎設施) · 協同 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
為處理程序的記憶體用量設定上限(heap 大小等),並檢查洩漏。
基礎設施團隊要做的事
將遊戲伺服器設定為不使用 swap,並以記憶體警示因應;關閉 swap 後,記憶體一不足就會被強制終止(OOM),因此要準備比尖峰用量更充裕的 RAM。
數值參考
讀取 RAM 約 100ns,從 SSD 讀回約 100µs(1,000 倍),透過網路存取的雲端磁碟約 1ms(1 萬倍),HDD 則是 10ms(10 萬倍)。
圖表上
緩慢爬升 · swap 用量、swap in/out
查看位置
把 vmstat 1 的 si、so 欄(每秒從 swap 讀回、移出到 swap 的量)、/proc/pressure/memory 的 some、full(因等待記憶體而停住的時間比例)、遊戲伺服器處理程序的 pidstat -r majflt/s(必須從磁碟讀入的分頁錯誤)與 tick 時間疊在一起看
符合的跡象
lag 發生時 si 大於 0,遊戲伺服器的 majflt/s 與 memory 的 full 值一起上升
不符合的跡象
si、so 為 0 且 memory 壓力(PSI)也接近 0 時,原因不在 swap。沒有 swap 但 majflt/s 與 PSI 上升時,代表記憶體耗盡、正在重新讀入程式碼分頁,要先確保有足夠的記憶體
確認方式
用基礎設施工具確認(不需要遊戲程式碼)
深入了解
使用 GC 的伺服器在回收時會讀遍整個 heap,因此只要 heap 有一部分被 swap 出去,單次 GC 就可能拉長到數秒~數十秒。關閉 swap 後,不會經過因 swap 而變慢的階段,會直接進入強制終止(OOM),所以必須先確保有足夠的可用記憶體。即使沒有 swap,記憶體快用完時,OS 也會把執行檔的程式碼分頁移出記憶體再重新讀入,因此在被強制終止前,整個伺服器可能會有一段時間嚴重變慢。

出處

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    「Numbers Everyone Should Know」:主記憶體存取 100ns、磁碟尋軌 10ms(以 2009 年為準)
  2. Documentation for /proc/sys/vm/ Linux kernel
    swappiness:swap 與回收檔案分頁的相對成本;swap 屬於隨機 I/O,成本較高
  3. Concepts overview Linux kernel
    回收在磁碟上有原始資料的頁面快取與可 swap 的分頁,仍不夠時由 OOM killer 終止處理程序
  4. Solidigm™ D7-P5520 and D7-P5620 Product Brief Solidigm
    伺服器用 NVMe SSD 的 99.99% 延遲(four-nines latency)為 130µs:SSD 單次讀取約 100µs 的依據
  5. Amazon EBS General Purpose SSD volumes AWS
    雲端預設磁碟(gp3)的延遲為個位數 ms
  6. vmstat(8) — Linux manual page procps-ng
    si:每秒從 swap 讀回的記憶體;so:每秒移出到 swap 的記憶體
  7. PSI - Pressure Stall Information Linux kernel
    /proc/pressure/memory 的 some(部分工作停住的時間比例)與 full(所有工作同時停住的時間比例)
  8. pidstat(1) — Linux manual page sysstat
    -r:majflt/s(必須從磁碟讀入分頁的錯誤次數)

相關原因

同一層:L10 記憶體

同一症狀(慢動作)在其他層的原因

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