一、故障排除的黄金法则:先问为什么

遇到服务器报警时,别急着敲命令。先问三个问题:

  1. 现象是什么:比如Nginx返回502错误
  2. 影响范围:是单个用户还是所有服务?
  3. 最近变更:是否刚做过发布或配置调整?

示例: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,运维排查也要分层:

  1. 网络层:ping/telnet/traceroute
  2. 系统层:CPU/内存/磁盘/进程
  3. 应用层:服务日志/线程堆栈

示例:数据库连接池泄漏排查

-- 技术栈: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 构建监控三板斧

  1. 基础监控:CPU/内存/磁盘
  2. 业务监控:订单量/支付成功率
  3. 链路监控:全链路追踪

示例:简易服务健康检查脚本

#!/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条改进措施

五、常见踩坑与避雷指南

  1. 日志陷阱

    • 错误日志等级设置不合理(把DEBUG当ERROR用)
    • 日志轮转策略导致关键信息丢失
  2. 配置误区

    • 生产环境使用开发配置(比如没关调试模式)
    • 配置文件权限过大(777权限泄露敏感信息)
  3. 人为失误

    • 直接在生产环境debug(导致雪崩效应)
    • 没有备份就修改配置(建议使用版本控制)

终极忠告

  • 每次操作前问自己"这个命令会炸机房吗"
  • 复杂操作一定要先在小范围验证