一、故障排除的黄金法则:先问为什么
遇到服务器报警时,别急着敲命令。先问三个问题:
- 现象是什么:比如Nginx返回502错误
- 影响范围:是单个用户还是所有服务?
- 最近变更:是否刚做过发布或配置调整?
示例:Linux服务器CPU飙高排查
# 技术栈:Linux + Bash
# 步骤1:快速定位问题进程
top -c -o %CPU # 按CPU使用率排序显示完整命令
# 步骤2:分析线程级资源占用(假设发现Java进程异常)
pidstat -t -p <PID> 1 3 # 查看该进程的线程统计
# 步骤3:结合业务日志定位代码问题
grep "ERROR" /var/log/app.log | tail -n 50 # 检查最近错误日志
这个例子展示了从现象到根源的推理过程。记住:80%的问题通过查看日志就能定位。
二、建立系统化的排查流程
2.1 分层诊断法
就像医生看病要先量体温再拍CT,运维排查也要分层:
- 网络层:ping/telnet/traceroute
- 系统层:CPU/内存/磁盘/进程
- 应用层:服务日志/线程堆栈
示例:数据库连接池泄漏排查
-- 技术栈:MySQL
-- 步骤1:确认连接数异常
SHOW STATUS LIKE 'Threads_connected'; -- 当前连接数
SHOW PROCESSLIST; -- 查看活跃连接详情
-- 步骤2:定位泄漏来源(发现大量sleep连接)
SELECT * FROM performance_schema.threads
WHERE PROCESSLIST_COMMAND = 'Sleep'
AND TIME_MS > 60000; -- 查找长时间空闲连接
2.2 最小化复现原则
当遇到偶发故障时:
- 尝试用最简单的方式复现问题
- 排除非相关变量干扰
三、必须掌握的诊断工具包
3.1 网络诊断三件套
# 技术栈:Linux网络工具
# 连通性测试(比ping更详细)
mtr 8.8.8.8 # 可视化路由跟踪
# 端口可用性检查
nc -zv 192.168.1.100 3306 # 测试MySQL端口
# 抓包分析(过滤HTTP请求)
tcpdump -i eth0 port 80 -w /tmp/http.pcap
3.2 系统资源分析进阶
# 技术栈:Linux性能工具
# 内存泄漏排查
vmstat 1 # 实时监控内存交换情况
valgrind --leak-check=yes ./your_program # 内存检测
# 磁盘IO瓶颈定位
iotop -o # 显示实际磁盘读写进程
四、从应急到预防的思维升级
4.1 构建监控三板斧
- 基础监控:CPU/内存/磁盘
- 业务监控:订单量/支付成功率
- 链路监控:全链路追踪
示例:简易服务健康检查脚本
#!/bin/bash
# 技术栈:Shell + HTTP
check_service() {
local url=$1
http_code=$(curl -s -o /dev/null -w "%{http_code}" $url)
if [ $http_code -ne 200 ]; then
echo "[$(date)] 服务异常: $url 状态码 $http_code" >> /var/log/healthcheck.log
# 自动重启逻辑(根据实际情况添加)
fi
}
# 检查核心服务
check_service "http://localhost:8080/health"
check_service "http://localhost:3306/ping"
4.2 事后复盘要点
- 整理完整的时间线
- 记录所有尝试过的操作
- 制定至少3条改进措施
五、常见踩坑与避雷指南
日志陷阱:
- 错误日志等级设置不合理(把DEBUG当ERROR用)
- 日志轮转策略导致关键信息丢失
配置误区:
- 生产环境使用开发配置(比如没关调试模式)
- 配置文件权限过大(777权限泄露敏感信息)
人为失误:
- 直接在生产环境debug(导致雪崩效应)
- 没有备份就修改配置(建议使用版本控制)
终极忠告:
- 每次操作前问自己"这个命令会炸机房吗"
- 复杂操作一定要先在小范围验证
评论