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

游戏卡顿白皮书 › L11 磁盘

服务器端懒加载 Lazy loading on the server

原因 ID dk-lazy-load · 主责 研发团队·服务器开发 · 配合 运维团队·系统运维

在含图示和实验的完整版中打开此卡片 →

服务器第一次收到副本、地图数据请求时才从磁盘读取,那个 tick 期间所有人都会卡住。

起因 有人第一次进入某个副本或区域 → 结果 服务器在游戏线程里从磁盘读数据 → 画面表现 这台服务器上的所有人短暂卡住

症状
卡住
因素
停顿
谁会遇到
特定地点/分线, 全服
何时出现
移动中/切换地图时
负责方
主责 研发团队·服务器开发 · 配合 运维团队·系统运维
研发团队要做的事
服务器启动时预加载,异步加载。
运维团队要做的事
刚从快照创建的服务器,在投入服务前预热磁盘(把所有块读一遍),或使用快速快照恢复功能。
监控图上
偶发随机尖峰 · 服务器 tick 耗时、磁盘读取
查看位置
把停顿时刻与游戏服务器日志中副本、区域的首次进入记录对照,看当时游戏服务器的磁盘读取(pidstat -d 的 kB_rd/s),并用 perf trace --duration 找耗时长的 read、open 调用。新拉起的云服务器,把 EBS 的 VolumeAvgReadLatency 与运行已久的服务器对比
确认依据
只在首次进入时停顿,第二次进入同一地方不再停顿。停顿期间游戏线程在等文件读取
排除依据
已加载的区域同样停顿,是 tick 超出预算、GC 等其他原因
确认手段
需要游戏服务器/客户端的日志和指标
深入了解
在云上刚用快照(磁盘副本)创建的服务器,每个第一次读取的块都要从远端存储拉取,比平时慢得多。如果只有弹性伸缩新拉起的服务器首次进入特别慢,就该怀疑这个原因。

出处

  1. Initialize Amazon EBS volumes AWS
    由快照创建的卷,在从 S3 拉取块期间延迟增加、性能下降;用 dd、fio 读一遍所有块,预先初始化
  2. Amazon EBS fast snapshot restore AWS
    快速快照恢复在创建时就提供已初始化的卷,消除首次访问延迟
  3. pidstat(1) — Linux manual page sysstat
    -d:各进程的 kB_rd/s(每秒磁盘读取量)
  4. perf-trace(1) — Linux manual page perf
    --duration 只显示耗时超过指定 ms 的系统调用
  5. Amazon CloudWatch metrics for Amazon EBS AWS
    VolumeAvgReadLatency:1 分钟平均读取延迟(Nitro 实例)

相关原因

同一层:L11 磁盘

其他层中同样导致“卡住”的原因

查看含图示和实验的原卡片