[系统/功能] 故障排查手册
文档版本:v1.0
适用环境:生产环境 / 测试环境
更新日期:2025-01-20
维护团队:[团队名称]
概述
本文档提供 [系统名称] 的常见故障排查指南,包括问题诊断、解决方案和预防措施。
紧急联系方式
| 角色 | 姓名 | 联系方式 | 工作时间 |
|---|---|---|---|
| 技术负责人 | 张三 | 138xxxx1234 | 24小时 |
| 运维工程师 | 李四 | 138xxxx5678 | 9:00-21:00 |
| 开发工程师 | 王五 | 138xxxx9012 | 9:00-18:00 |
一、快速诊断流程
二、常见问题分类
| 等级 | 影响范围 | 响应时间 | 示例 |
|---|---|---|---|
| P0 - 紧急 | 核心功能不可用,影响所有用户 | 15分钟内 | 系统宕机、数据库崩溃 |
| P1 - 高优先级 | 重要功能异常,影响大部分用户 | 1小时内 | 支付失败、登录缓慢 |
| P2 - 中优先级 | 部分功能异常,影响部分用户 | 4小时内 | 报表错误、通知延迟 |
| P3 - 低优先级 | 小问题,影响体验 | 1个工作日内 | UI显示问题、文案错误 |
三、系统无响应问题
3.1 问题描述
症状:
- 网站无法访问
- API请求超时
- 服务器无响应
3.2 诊断步骤
步骤1:检查服务状态
bash
1# 检查应用进程2ps aux | grep java3ps aux | grep node45# 检查端口占用6netstat -tunlp | grep 80807lsof -i :808089# 检查系统资源10top11free -h12df -h步骤2:检查网络连接
bash
1# 测试网络连通性2ping api.example.com34# 测试端口是否开放5telnet api.example.com 806nc -zv api.example.com 8078# 查看网络连接9netstat -an | grep ESTABLISHED步骤3:检查日志
bash
1# 查看应用日志2tail -f /var/log/app/application.log34# 查看错误日志5tail -f /var/log/app/error.log67# 查看系统日志8tail -f /var/log/syslog910# 搜索特定错误11grep "OutOfMemoryError" /var/log/app/*.log3.3 常见原因与解决方案
| 原因 | 症状 | 解决方案 | 预防措施 |
|---|---|---|---|
| 进程崩溃 | 找不到应用进程 | 重启应用服务 | 配置进程守护、添加健康检查 |
| 内存溢出 | OutOfMemoryError | 增加堆内存、重启服务 | 优化内存使用、添加监控告警 |
| 端口被占用 | 无法绑定端口 | 终止占用进程或更换端口 | 使用标准端口、配置端口管理 |
| 磁盘空间满 | 无法写入日志 | 清理日志文件、扩容磁盘 | 配置日志轮转、监控磁盘使用 |
3.4 解决方案示例
方案1:重启应用服务
bash
1# 使用systemd重启2sudo systemctl restart myapp34# 使用PM2重启5pm2 restart myapp67# 使用Docker重启8docker restart myapp-container方案2:清理磁盘空间
bash
1# 查找大文件2du -h /var/log | sort -rh | head -2034# 压缩旧日志5gzip /var/log/app/*.log.167# 删除旧日志8find /var/log/app -name "*.log.*" -mtime +7 -delete910# 清理Docker镜像11docker system prune -a四、性能问题
4.1 响应时间慢
诊断工具
bash
1# 测试API响应时间2curl -w "\nTime: %{time_total}s\n" https://api.example.com/health34# 使用ab进行压力测试5ab -n 1000 -c 100 https://api.example.com/67# 查看数据库慢查询8mysql> SHOW FULL PROCESSLIST;9mysql> SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 5;性能分析
bash
1# JVM性能分析2jstack <pid> > thread_dump.txt3jmap -heap <pid>45# Node.js性能分析6node --prof app.js7node --prof-process isolate-*.log > processed.txt89# 系统性能分析10vmstat 1 1011iostat -x 1 104.2 数据库性能问题
检查连接数
sql
1-- MySQL2SHOW STATUS LIKE 'Threads_connected';3SHOW VARIABLES LIKE 'max_connections';45-- 查看慢查询6SHOW VARIABLES LIKE 'slow_query%';7SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;优化建议
sql
1-- 添加索引2CREATE INDEX idx_user_email ON users(email);34-- 分析查询计划5EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';67-- 优化表8OPTIMIZE TABLE users;五、数据库连接问题
5.1 连接池耗尽
症状:
1ERROR: Connection pool is exhausted2Unable to acquire connection from pool诊断:
bash
1# 查看数据库连接2mysql> SHOW FULL PROCESSLIST;34# 查看连接池配置5grep -A 10 "datasource" application.yml解决方案:
yaml
1# 调整连接池配置2spring:3 datasource:4 hikari:5 maximum-pool-size: 206 minimum-idle: 57 connection-timeout: 300008 idle-timeout: 6000009 max-lifetime: 18000005.2 连接超时
诊断命令:
bash
1# 测试数据库连接2mysql -h localhost -u root -p -e "SELECT 1"34# 检查网络延迟5ping database-host67# 检查防火墙8telnet database-host 3306六、内存泄漏问题
6.1 诊断步骤
bash
1# 查看内存使用2free -m3ps aux --sort=-%mem | head45# JVM内存分析6jmap -dump:live,format=b,file=heap.bin <pid>78# 使用MAT分析dump文件9# 下载 Eclipse Memory Analyzer Tool1011# Node.js内存分析12node --inspect app.js13# 在Chrome中打开 chrome://inspect6.2 常见原因
| 原因 | 症状 | 解决方案 |
|---|---|---|
| 缓存未清理 | 内存持续增长 | 设置缓存过期时间、定期清理 |
| 事件监听器泄漏 | 监听器越来越多 | 及时移除监听器 |
| 闭包引用 | 对象无法回收 | 避免不必要的闭包 |
| 数据库连接未关闭 | 连接数持续增加 | 使用try-finally确保关闭 |
七、日志分析
7.1 错误日志关键词
bash
1# 搜索常见错误2grep -i "error" application.log3grep -i "exception" application.log4grep -i "failed" application.log56# 统计错误次数7grep -c "NullPointerException" application.log89# 查看错误上下文10grep -A 5 -B 5 "OutOfMemoryError" application.log7.2 日志分析工具
bash
1# 使用awk分析日志2awk '/ERROR/ {print $0}' application.log34# 使用grep和sort统计5grep "ERROR" application.log | cut -d' ' -f5 | sort | uniq -c | sort -rn67# 实时监控日志8tail -f application.log | grep --line-buffered "ERROR"八、监控与告警
8.1 关键指标
| 指标类型 | 监控项 | 告警阈值 | 处理优先级 |
|---|---|---|---|
| 系统资源 | CPU使用率 | > 80% | P1 |
| 内存使用率 | > 85% | P1 | |
| 磁盘使用率 | > 90% | P0 | |
| 应用性能 | API响应时间 | > 1s | P2 |
| 错误率 | > 1% | P1 | |
| QPS | 异常波动 | P2 | |
| 数据库 | 连接数 | > 80% | P1 |
| 慢查询数 | > 100/分钟 | P2 | |
| 锁等待 | > 5秒 | P1 |
8.2 监控工具推荐
| 工具 | 类型 | 优势 | 适用场景 |
|---|---|---|---|
| Prometheus | 指标监控 | 灵活强大、社区活跃 | 全面监控 |
| Grafana | 可视化 | 图表丰富、易于使用 | 数据展示 |
| ELK Stack | 日志分析 | 功能全面、搜索强大 | 日志管理 |
| Zabbix | 综合监控 | 开箱即用、告警完善 | 传统监控 |
九、应急响应流程
9.1 紧急故障处理
9.2 故障响应清单
- 记录故障发现时间
- 评估影响范围和用户数
- 通知相关负责人
- 隔离故障组件
- 实施临时方案
- 验证修复效果
- 监控系统稳定性
- 编写故障报告
- 制定预防措施
十、预防措施
10.1 日常检查清单
每日检查:
- 查看系统监控大盘
- 检查错误日志
- 查看关键接口性能
- 确认备份任务执行
每周检查:
- 审查慢查询日志
- 检查磁盘空间
- 更新依赖版本
- 执行压力测试
每月检查:
- 安全漏洞扫描
- 性能基准测试
- 故障演练
- 文档更新
10.2 最佳实践
💡 运维建议
- 自动化监控:配置完善的监控告警系统
- 日志规范:统一日志格式,便于分析
- 文档更新:及时记录故障和解决方案
- 演练机制:定期进行故障演练
- 备份策略:确保关键数据定期备份
十一、常用命令速查
Linux系统命令
bash
1# 进程管理2ps aux | grep java3kill -9 <pid>4systemctl status myapp56# 网络诊断7netstat -tunlp8ss -tunlp9tcpdump -i eth0 port 801011# 磁盘管理12df -h13du -sh /*14lsof | grep deleted1516# 日志查看17tail -f /var/log/app.log18journalctl -u myapp -fDocker命令
bash
1# 容器管理2docker ps3docker logs -f container_name4docker exec -it container_name bash5docker restart container_name67# 资源查看8docker stats9docker system df十二、故障案例库
案例1:数据库死锁导致服务假死
时间:2025-01-15 14:30
影响:订单创建功能不可用,持续15分钟
原因:两个事务互相等待对方释放锁
解决:手动终止死锁事务,优化事务顺序
预防:添加死锁检测告警,优化SQL执行顺序
案例2:Redis缓存雪崩
时间:2025-01-18 10:00
影响:系统响应慢,数据库负载飙升
原因:大量缓存同时过期,请求直接打到数据库
解决:重启Redis,设置随机过期时间
预防:缓存过期时间添加随机值,实现缓存预热
附录
A. 联系方式
| 服务 | 联系方式 |
|---|---|
| 技术支持热线 | 400-xxx-xxxx |
| 运维邮箱 | ops@example.com |
| 钉钉群 | xxxxx |
| 值班表 | 查看值班表 |
B. 相关文档
重要提醒
在生产环境进行任何操作前,请务必:
- 评估影响范围
- 准备回滚方案
- 通知相关人员
- 做好操作记录
评论