当重庆云主机的故障只在每天固定时段出现,抓包和日志轮转往往来不及留下可用证据。更有效的做法是先缩小到“哪一层在变”,再用持续采样把瞬时状态固化下来,而不是等到故障复现时临时登机器碰运气。下面用一个假设情境把取舍讲清楚。
特定时段故障通常有两类成因,处理方式完全不同。
区分方法:在故障时段和非故障时段各取一次相同的资源指标与请求分布,对比哪一项差异最大。如果只有资源曲线抬高,优先怀疑争抢;如果请求构成明显不同,优先怀疑代码路径或缓存状态。
优点是不产生长期存储成本,采集到的都是真实故障瞬间。代价是必须有人守在时段内,且故障持续时间短于登录和启动采集的时间就白跑。适用条件是故障窗口可预测、持续几分钟以上、且你能在窗口内完成操作。
在时段到来前就开启环形缓冲或短周期落盘,故障发生后回看。优点是无需守候,能覆盖秒级抖动。代价是需要提前规划采样项和存储,采集过细会挤占磁盘 IO,反而制造新的资源竞争。
选择依据:如果故障窗口稳定且持续时间足够长,现场抓取更省事;如果窗口漂移、持续只有几秒,必须用持续采样。后者要注意采样本身的开销——把采集频率调低到只够定位层级,再在确认层级后临时提高精度。
假设一台重庆云主机上运行的接口,每天 09:00 到 09:15 响应变慢,其余时间正常。运维先在 08:55 登录,用 top 和 iostat 观察,发现 09:00 起磁盘写入等待明显上升,但 CPU 空闲。此时不能直接下结论说是磁盘故障。
下一步动作:把该时段的应用日志、系统 IO 指标和同时段其他进程的写入量对齐到同一时间轴。如果只有本机写入上升,检查本机是否有定时任务;如果多台同区域主机同时上升,则更可能是共享存储或同宿主机上的邻居负载。这一步的结果直接决定排查方向——是改本机任务,还是向平台侧确认底层资源。
若对齐后仍无法判断,再开启一次限定时段的持续采样,把每秒的 IO 等待和请求延迟一起记录,事后比对两者的先后顺序。谁先动,谁更可能是触发点。
需要提醒的是,抓取量或请求量在某一时段归零,并不能单独证明服务已恢复或问题已定位——也可能是采集进程本身被资源争抢拖慢、日志写入失败或采样窗口没覆盖到。遇到这类异常,先确认采集链路自身是否正常,再解读数据。
如果连续几个时段都无法在不影响业务的前提下拿到证据,继续加采集只会放大资源竞争。此时更务实的动作是把可疑时段的任务或流量临时隔离到独立实例上,观察错误是否随之消失。隔离验证的代价是额外资源开销和架构改动,但它给出的因果关系比间接指标更可靠。确认层级之后,再回到原实例做精细化取证,成本会低得多。