深色模式
典型故障案例集
摘要:本文汇编六类高频故障,每例按"现象 → 定位 → 根因 → 修复 → 改进项"组织。重点不在记住结论,而在理解每类故障的定位切入点和它对应的检测手段缺口。
适用环境
bash
# 案例中的命令均为通用工具,先确认可用
which df lsof ss dig openssl chronyc kubectl1
2
2
案例一:磁盘被日志打满,服务写入失败
- 现象:服务报
No space left on device,但业务量正常 - 定位:
df -h显示 100%,du -sh /var/log却只统计到很小 - 根因:日志文件已被轮转删除,但应用仍持有旧句柄,空间未释放
- 修复:重载应用释放句柄,日志改用
copytruncate或支持重新打开 - 改进项:增加 inode 与磁盘增长速率告警,日志级别与保留策略纳入发布检查
bash
lsof +L1 | head -20 # 找到已删除但仍被占用的文件1
案例二:连接数耗尽导致建连失败
- 现象:高峰期偶发
Cannot assign requested address,平时正常 - 定位:
ss -ant state time-wait | wc -l接近临时端口上限 - 根因:短连接调用外部服务,TIME_WAIT 堆积占满临时端口
- 修复:改为长连接/连接池,调大
ip_local_port_range - 改进项:把连接池使用率与 TIME_WAIT 数量纳入监控
bash
ss -s
cat /proc/sys/net/ipv4/ip_local_port_range1
2
2
案例三:DNS 解析偶发超时
- 现象:调用外部接口偶发 2~3 秒延迟,重试即成功
- 定位:
dig正常,抓包发现每次实际发出多倍查询请求 - 根因:
resolv.conf中 search 域 +ndots:5导致先拼接多次无效查询 - 修复:容器中使用完整域名并调整
ndots - 改进项:把 DNS 解析耗时作为独立指标监控
bash
cat /etc/resolv.conf
tcpdump -i any -nn -c 20 'port 53'1
2
2
案例四:证书"已过期"其实没过期
- 现象:部分客户端报证书过期,浏览器访问正常
- 定位:
openssl s_client显示Verify return code: 21(缺少中间证书) - 根因:服务端只部署了叶子证书,浏览器能自动补全,程序客户端不能
- 修复:部署完整链(fullchain)
- 改进项:上线前用
openssl s_client校验返回码为 0
bash
openssl s_client -connect <域名>:443 -servername <域名> </dev/null 2>&1 | grep 'Verify return code'1
案例五:时钟漂移引发大面积鉴权失败
- 现象:大量请求报签名无效, sporadic 分布,无明显规律
- 定位:对比 HTTPS 响应头
Date与本机时间,偏差超过允许窗口 - 根因:虚拟机时钟漂移,chrony 服务未随系统启动
- 修复:启用并守护 chronyd,先平滑校时
- 改进项:把时钟偏差作为基础监控项并纳入告警
bash
chronyc tracking
curl -sSI https://www.cloudflare.com | grep -i '^date'1
2
2
案例六:灰度发布后部分实例异常
- 现象:灰度 10% 流量后错误率上升,重启实例可暂时恢复
- 定位:对比新旧实例的配置文件,发现只有部分实例读到新配置
- 根因:配置中心按实例灰度推送,新旧配置语义不兼容
- 修复:回滚配置至统一版本,修正兼容性后重新灰度
- 改进项:配置变更与代码发布解耦,配置灰度需有全量收敛时限
bash
kubectl exec -it <pod> -n <ns> -- cat /etc/app/application.yml | grep -A 3 '<关键配置>'1
常见坑
只记结论不记定位方法
同类故障换了表现就认不出来。应掌握每类问题的切入命令,而非背诵案例。
案例复盘中漏掉"为什么没被发现"
检测手段的缺口才是复发的根源,改进项必须包含监控与告警补齐。
把案例中的命令当作可直接执行的修复脚本
案例给的是定位思路,命令中的占位符与前提各不相同,直接套用可能造成误操作。