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

游戏卡顿白皮书 › L11 磁盘

磁盘写满 Disk full

原因 ID dk-full · 主责 运维团队·系统运维 · 配合 运维团队·数据库运维, 研发团队·服务器开发

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

日志和 dump 堆积把磁盘写满后,写入会失败;没有做好应对,服务器就会崩溃。

起因 日志、dump、临时文件堆积到 100% → 结果 写入失败。没有错误处理就崩溃,有错误处理则存盘失败 → 画面表现 掉线,进度回档

症状
掉线, 吞操作/回档
因素
停顿
谁会遇到
全服
何时出现
开得越久越严重
负责方
主责 运维团队·系统运维 · 配合 运维团队·数据库运维, 研发团队·服务器开发
研发团队要做的事
处理写入失败,用存盘重试和告警代替崩溃,减少不必要的日志和 dump。
运维团队要做的事
服务器/OS:日志轮转,容量告警,日志盘与数据盘分离。DB 服务器:监控 DB 事务日志(WAL、binlog)是否因复制中断、日志备份遗漏而堆积。
监控图上
缓慢爬升 · 磁盘使用率
查看位置
看 df -h 的使用率和 df -i 的 inode 使用率,在服务器和 DB 日志里找 ENOSPC 错误。DB 方面,PostgreSQL 看 pg_replication_slots 中 active 为 false 的槽,MySQL 看 SHOW BINARY LOGS 的文件数和大小,SQL Server 看 sys.databases 的 log_reuse_wait_desc,RDS 看 FreeStorageSpace
确认依据
使用率连续几天稳步上升,到达 100% 的时刻与崩溃、存盘失败的时间重合,日志里有 ENOSPC
排除依据
空间充足而写入失败,是权限、文件大小上限等其他原因
确认手段
运维工具即可确认(无需游戏代码)
深入了解
从库停止复制或漏做日志备份时,DB 的事务日志(WAL、binlog 等)不会被清理,会一直堆积。这块磁盘一满,DB 的所有写入都会停止,存盘和交易会一起失败。

出处

  1. write(2) — Linux manual page Linux man-pages
    设备没有剩余空间时,写入以 ENOSPC 错误失败
  2. Monitoring Disk Usage (PostgreSQL Documentation) PostgreSQL
    WAL 所在磁盘写满时,DB 服务器可能会 panic 退出
  3. Log-Shipping Standby Servers (PostgreSQL Documentation) PostgreSQL
    复制槽在从库接收之前不会删除 WAL,可能把 pg_wal 空间占满(可用 max_slot_wal_keep_size 限制)
  4. Troubleshoot a full transaction log (SQL Server Error 9002) Microsoft SQL Server
    日志写满后 DB 只能读、不能修改;日志备份遗漏、复制延迟、长事务是阻碍日志清理的常见原因;具体是什么在阻碍,用 sys.databases 的 log_reuse_wait_desc 确认
  5. df(1) — Linux manual page coreutils
    各文件系统的使用量,-i 改为显示 inode 使用量
  6. pg_replication_slots (PostgreSQL Documentation) PostgreSQL
    active:该槽当前是否正在流复制,wal_status:槽保留的 WAL 是否超过 max_wal_size
  7. SHOW BINARY LOGS Statement MySQL
    服务器上的二进制日志文件列表及文件大小(File_size)
  8. Amazon CloudWatch metrics for Amazon RDS AWS
    FreeStorageSpace:DB 实例的剩余存储空间

相关原因

同一层:L11 磁盘

其他层中同样导致“掉线”的原因

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