Yihui’s Blog

系统每天固定瘫痪一小时

日期:2026-07-11
标签:#面试 #八股 #后端 #系统设计 #场景题

一句话答案

固定时间发生的故障优先排查定时任务、批处理、备份、日志切割、缓存集中失效和外部依赖窗口,并通过时间相关性和资源曲线定位证据。

面试口语版

这种每天固定时段的问题很像周期性任务造成的资源争抢。我会先确定准确起止时间和影响范围,叠加查看 CPU、内存、GC、磁盘 I/O、数据库连接、锁等待、线程池和下游延迟,然后对照 Cron、数据同步、报表、备份、全量扫描、日志归档和证书/Token 刷新任务。常见情况是大 SQL 锁表、备份打满 I/O、缓存统一过期形成雪崩,或批处理占满线程池。先通过错峰、限速、资源隔离或暂停任务验证,再做根因修复。

可能原因

  • 数据库备份、统计报表、ETL 全量扫描、分区维护。
  • 缓存同一 TTL 集中失效,瞬间压垮数据库。
  • JVM 定时全量任务产生大量对象,引发连续 Full GC。
  • 日志压缩/切割、磁盘快照或磁盘空间临界。
  • 线程池或连接池被批任务占满,在线流量饥饿。
  • 上游流量周期峰值、第三方维护窗口、DNS/证书/Token 周期刷新异常。

高分补充

不要先重启。重启会销毁现场,应先保留线程栈、GC 日志、慢查询、锁等待、系统指标和 Trace 样本;应急止损后再离线分析。

面试官追问

  1. 如何证明是缓存雪崩?
  2. 如何隔离在线和离线任务资源?
  3. 数据库锁表如何定位?

面试官追问参考答案

1. 如何证明是缓存雪崩?

检查故障时缓存命中率是否骤降、过期 Key 数量是否突增,同时 Redis 流量下降或变化而数据库 QPS、连接和慢查询同步飙升。抽样 TTL 分布和请求 Trace,若大量 Key 在同一时间过期且回源占满数据库,证据链基本成立。

2. 如何隔离在线和离线任务资源?

数据库使用独立账号、连接池、只读副本和资源组限制离线查询;计算层分线程池、队列、容器和节点,设置 CPU/内存/I/O 配额。任务错峰、限速和分批运行,在线指标恶化时自动暂停离线任务。

3. 数据库锁表如何定位?

查看数据库活动会话、锁等待图、长事务和当前 SQL,例如 MySQL 的 performance_schema、SHOW ENGINE INNODB STATUS。找到阻塞链根节点后确认业务和事务持续时间,止损前评估回滚成本;根治长事务、缺失索引、批量更新和不一致加锁顺序。

维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章