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

遊戲 Lag 白皮書 › L11 磁碟

fsync 暴增 fsync storms

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

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

要求把資料「確實」寫入磁碟時,依磁碟不同,每次需要 0.1ms~數十 ms;請求一多,佇列就會變長。

為什麼 定期存檔、登出潮使確實寫入的請求大量湧入 → 於是 磁碟佇列變長 → 畫面上 每到存檔時間就 lag,登出、切換頻道變慢

症狀
卡頓, 輸入延遲
因素
停滯, 延遲
誰會遇到
整個伺服器
何時
固定週期, 人潮湧入時
負責單位
主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(伺服器基礎設施), 基礎設施團隊(DB 基礎設施)
遊戲開發團隊要做的事
把多次存檔合併成一次(多筆存檔只呼叫一次 fsync)、分散存檔時間。
基礎設施團隊要做的事
伺服器設備/OS:採用具斷電保護的伺服器用 SSD,監控磁碟佇列長度與 fsync 延遲。DB 設備:存檔寫入 DB 時,DB 的 log 磁碟也換成同類 SSD,並監控 commit 延遲。
數值參考
每次所需時間依設備而異,大致是:伺服器用 SSD(具斷電保護)0.1ms、一般 SSD 1~數 ms、雲端磁碟 1~2ms、HDD 10ms 以上。由單一執行緒一個一個等待的話,HDD 每秒連 100 次都做不到。
圖表上
固定週期飆高 · 磁碟佇列長度、flush 與寫入延遲
查看位置
把 iostat -x 1 的 f/s、f_await(磁碟處理的 flush 次數與耗時)以及 w/s、aqu-sz、w_await,與定期存檔、登出的時間疊在一起看。舊版 sysstat 把 aqu-sz 顯示為 avgqu-sz。雲端磁碟則看 EBS 的 VolumeQueueLength、VolumeAvgWriteLatency
符合的跡象
每到存檔時間或登出潮,flush 次數與佇列長度一起往上衝,w_await、f_await 變成平常的好幾倍。此時存檔、切換頻道變慢
不符合的跡象
在與存檔、登出無關的時間佇列往上衝時,是備份、壓縮(dk-backup)或 IOPS 上限(dk-iops)。flush 次數不變卻變慢時,是 burst credit 耗盡的問題(dk-burst)
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. fsync(2) — Linux manual page Linux man-pages
    fsync 會連磁碟快取一併清空,並阻塞到裝置回報完成為止
  2. Reliability (PostgreSQL Documentation) PostgreSQL
    一般 SATA 磁碟與許多 SSD 的寫入快取在斷電時會遺失,要確實寫入,需要有電池或斷電保護的快取
  3. Amazon EBS General Purpose SSD volumes AWS
    雲端預設磁碟(gp3)的延遲為個位數 ms,io2 Block Express 在 16KiB I/O 下平均不到 500µs
  4. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    HDD 尋軌一次 10ms
  5. iostat(1) — Linux manual page sysstat
    -x:f/s、f_await(磁碟處理的 flush 請求數與平均時間)、w/s、w_await、aqu-sz(舊名 avgqu-sz)
  6. Amazon CloudWatch metrics for Amazon EBS AWS
    VolumeQueueLength(等待完成的請求數)、VolumeAvgWriteLatency(1 分鐘平均寫入延遲,Nitro 執行個體)

相關原因

同一層:L11 磁碟

同一症狀(卡頓)在其他層的原因

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