游戏卡顿白皮书 › 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 的所有写入都会停止,存盘和交易会一起失败。
出处
- write(2) — Linux manual page Linux man-pages
设备没有剩余空间时,写入以 ENOSPC 错误失败 - Monitoring Disk Usage (PostgreSQL Documentation) PostgreSQL
WAL 所在磁盘写满时,DB 服务器可能会 panic 退出 - Log-Shipping Standby Servers (PostgreSQL Documentation) PostgreSQL
复制槽在从库接收之前不会删除 WAL,可能把 pg_wal 空间占满(可用 max_slot_wal_keep_size 限制) - Troubleshoot a full transaction log (SQL Server Error 9002) Microsoft SQL Server
日志写满后 DB 只能读、不能修改;日志备份遗漏、复制延迟、长事务是阻碍日志清理的常见原因;具体是什么在阻碍,用 sys.databases 的 log_reuse_wait_desc 确认 - df(1) — Linux manual page coreutils
各文件系统的使用量,-i 改为显示 inode 使用量 - pg_replication_slots (PostgreSQL Documentation) PostgreSQL
active:该槽当前是否正在流复制,wal_status:槽保留的 WAL 是否超过 max_wal_size - SHOW BINARY LOGS Statement MySQL
服务器上的二进制日志文件列表及文件大小(File_size) - Amazon CloudWatch metrics for Amazon RDS AWS
FreeStorageSpace:DB 实例的剩余存储空间
相关原因
同一层:L11 磁盘
其他层中同样导致“掉线”的原因
查看含图示和实验的原卡片