第79章:故障排查方法论

第七十九章:故障排查方法论

79.1 排查流程

系统化排查方法

故障排查就像医生看病,需要"望闻问切":

graph LR
    A[收集信息] --> B[分析问题]
    B --> C[定位原因]
    C --> D[解决问题]
    D --> E[验证修复]
    E --> F[总结记录]

排查口诀

“一看二问三动手,四查五记六复查”

  • 一看:观察症状、错误信息、环境变化
  • 二问:了解最近变更、操作历史
  • 三动手:使用工具收集数据
  • 四查:分析数据、找出根因
  • 五记:记录过程和解决方案
  • 六复查:确认问题彻底解决

常用诊断工具

类别工具
系统信息top, htop, free, df, uptime
网络ping, traceroute, netstat, ss, tcpdump
进程ps, pgrep, pstree, lsof
日志journalctl, dmesg, /var/log/*
文件ls, stat, file, md5sum
性能perf, strace, ltrace

79.2 网络故障排查

连通性测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1. ping 测试(检查网络通不通)
ping 8.8.8.8
ping www.baidu.com

# 2. traceroute/tracert(检查路由)
traceroute www.baidu.com
tracert www.baidu.com     # Windows

# 3. mtr(结合 ping 和 traceroute)
mtr www.baidu.com

端口测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# telnet(经典方法)
telnet 192.168.1.1 80

# nc(Netcat)
nc -zv 192.168.1.1 80
nc -zv 192.168.1.1 22 80 443

# curl(测试 HTTP)
curl -v http://example.com
curl -I http://example.com

# 查看端口占用
ss -tuln | grep :80
netstat -tuln | grep :80

DNS 故障

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看 DNS 解析
nslookup www.baidu.com
dig www.baidu.com
host www.baidu.com

# 检查 DNS 配置
cat /etc/resolv.conf

# 测试 DNS 解析
ping -c 3 www.baidu.com

# 清 DNS 缓存
# 方法1:systemd-resolve(Ubuntu/Debian 新版)
sudo systemd-resolve --flush-caches

# 方法2:service 命令(旧版系统)
sudo service systemd-resolved restart

# 方法3:nmcli(NetworkManager)
nmcli general reload

# 方法4:直接重启解析服务
sudo systemctl restart systemd-resolved
# 或
sudo systemctl restart NetworkManager

# 验证缓存是否清除
systemd-resolve --statistics | grep "Current Cache Size"

79.3 服务故障排查

systemctl 状态检查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 查看服务状态
systemctl status nginx

# 关键信息:
# - Active: running (绿色)
# - Main PID: 主进程 PID
# - Processes: 子进程数
# - Memory: 内存使用

# 常用命令
systemctl start nginx          # 启动
systemctl stop nginx           # 停止
systemctl restart nginx        # 重启
systemctl reload nginx         # 重载配置
systemctl enable nginx         # 开机启动
systemctl disable nginx        # 取消开机启动
systemctl daemon-reload        # 重载 systemd 配置

journalctl 日志查看

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 查看服务日志
journalctl -u nginx

# 实时跟踪
journalctl -u nginx -f

# 最近日志
journalctl -u nginx -n 50

# 按时间过滤
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx --since today
journalctl -u nginx --since "2024-01-15 10:00:00" --until "2024-01-15 11:00:00"

# 查看错误日志
journalctl -p err -u nginx
journalctl -p err --since today

配置文件检查

1
2
3
4
5
6
7
8
# 语法检查
nginx -t
apache2ctl configtest
systemctl cat nginx           # 查看服务配置

# 查看配置
cat /etc/nginx/nginx.conf
nginx -T                      # 测试并显示完整配置

端口和进程检查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看端口占用
ss -tulpn | grep :80
netstat -tulpn | grep :80

# 查看进程
ps aux | grep nginx
pgrep -a nginx

# 查看进程打开的文件
lsof -i :80
lsof -p PID

79.4 磁盘故障排查

磁盘使用率

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 查看磁盘使用
df -h

# 查看 inode
df -i

# 找出大文件
du -sh /* | sort -h | tail -10

# 查看某个目录大小
du -sh /var/log

# 按大小排序
du -ah / | sort -rh | head -20

磁盘 IO 排查

1
2
3
4
5
6
7
8
# 查看 IO 等待
vmstat 1

# 查看 IO 统计
iostat -x 1

# 查看进程 IO
iotop

79.5 性能问题排查

资源使用分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# CPU 使用
top
htop

# 内存使用
free -h
cat /proc/meminfo

# 找出 CPU/内存占用高的进程
ps aux --sort=-%cpu | head
ps aux --sort=-%mem | head

进程挂起分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看进程状态
ps -ef | grep process_name

# 查看进程的父子关系
pstree -p PID

# 查看进程的系统调用
strace -p PID

# 查看进程打开的文件
lsof -p PID

79.6 日志分析技巧

grep 关键字搜索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 搜索错误
grep -i error /var/log/syslog
grep -E "error|warning|critical" /var/log/syslog

# 显示行号
grep -n "error" /var/log/syslog

# 显示上下文
grep -B 5 -A 5 "error" /var/log/syslog

# 统计错误次数
grep -c "error" /var/log/syslog

# 使用正则
grep -E "[0-9]{2}:[0-9]{2}:[0-9]{2}" /var/log/syslog

awk 数据提取

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 提取特定字段
awk '{print $1, $5}' /var/log/syslog

# 按条件过滤
awk '$3 == "CRON" {print}' /var/log/syslog

# 统计
awk '{print $5}' /var/log/access.log | sort | uniq -c | sort -rn

# 计算总和
awk '{sum+=$10} END {print sum}' /var/log/access.log

日志时间分析

1
2
3
4
5
6
7
8
# 按时间段分析
awk '/Jan 15 10:/ {print}' /var/log/syslog

# 统计每小时日志量
awk '{print $3}' /var/log/access.log | cut -d: -f1 | sort | uniq -c

# 查看错误时间分布
grep -i error /var/log/syslog | awk '{print $1, $2, $3}' | sort | uniq -c

79.7 常用诊断工具

strace 系统调用跟踪

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 跟踪进程系统调用
strace -p PID

# 跟踪命令执行
strace -o output.txt command

# 显示时间
strace -t -p PID

# 显示被调用的库
strace -e trace=open,read,write -p PID

lsof 文件/端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 查看端口占用
lsof -i :80
lsof -i -P -n | grep :80

# 查看进程打开的文件
lsof -p PID

# 查看谁在用文件
lsof /var/log/syslog

# 查看网络连接
lsof -i
lsof -i tcp
lsof -i udp

其他工具

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# dmesg 内核日志
dmesg
dmesg | tail
dmesg -T                      # 可读时间

# uptime 负载
uptime

# who 在线用户
who
w

# last 最近登录
last
last reboot

故障排查案例

案例一:网站打不开

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 1. 检查网络
ping www.example.com

# 2. 检查 DNS
nslookup www.example.com

# 3. 检查端口
curl -v www.example.com

# 4. 检查服务状态
systemctl status nginx

# 5. 检查日志
journalctl -u nginx --since "10 minutes ago"

案例二:服务器卡顿

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 1. 查看负载
uptime
top

# 2. 检查 CPU
mpstat 1

# 3. 检查内存
free -h

# 4. 检查磁盘
df -h
iostat 1

# 5. 查看进程
ps aux --sort=-%cpu | head

本章小结

本章我们学习了故障排查的系统化方法:

步骤说明
收集信息了解症状、环境、最近变更
分析问题使用工具排查
定位原因找出根因
解决问题执行修复
验证修复确认问题解决
总结记录记录过程,防止复发

故障排查思维导图:

graph TB
    A[故障] --> B[是系统性问题?]
    B -->|否| C[单个服务问题]
    B -->|是| D[系统级问题]
    C --> E[检查服务状态]
    D --> F[检查资源]
    E --> G[日志分析]
    F --> H[CPU/内存/磁盘/网络]
    G --> I[定位根因]
    H --> I
    I --> J[解决问题]

💡 温馨提示: 故障排查最重要的是冷静和系统化。别急着动手,先观察现象,了解背景,再一步步排查。遇到问题时,记得:“现象→分析→验证→解决”!


第七十九章:故障排查方法论 — 完结! 🎉


🎊 全书完结!🎊

教程总结

经过十五章的学习,我们完成了 Linux 核心教程的全部内容:

章节主题
第十九卷65-68云服务与 IaC
第二十卷69-70虚拟化技术
第二十一卷71-74安全测试
第二十二卷75-78性能优化
第二十三卷79故障排查

学习路线图

云服务(65-68) → 虚拟化(69-70) → 安全(71-74) → 优化(75-78) → 排障(79)

🎉 恭喜你完成了 Linux 核心教程全部 79 章!

从 Shell 脚本到 Git,从监控到备份,从自动化到高可用,从云计算到安全测试——你已经掌握了 Linux 世界的核心知识!

记住:技术是工具,思维是灵魂。持续学习,不断实践,你就是下一个 Linux 大师!

感谢阅读,祝学习愉快! 🚀

最后修改 March 24, 2026: 新增JavaScript教程 (37305c4)