Appearance
故障排查
本章将介绍 Linux 系统故障排查的方法和工具,包括日志分析、性能监控、常见问题诊断和解决方案,帮助你快速定位和解决系统问题。
故障排查方法论
排查流程
mermaid
graph TD
A[发现问题] --> B[收集信息]
B --> C[分析原因]
C --> D[制定方案]
D --> E[实施修复]
E --> F[验证结果]
F --> G{问题解决?}
G -->|否| C
G -->|是| H[记录总结]排查原则
- 先易后难:从最简单、最可能的原因开始排查
- 由近及远:先检查最近的变更,再检查历史问题
- 由表及里:从表面现象逐步深入到系统内部
- 隔离问题:缩小问题范围,排除干扰因素
- 保留现场:在修复前收集必要的信息
日志分析
系统日志
bash
# 系统日志位置
/var/log/syslog # Debian/Ubuntu 系统日志
/var/log/messages # RHEL/CentOS 系统日志
/var/log/auth.log # Debian/Ubuntu 认证日志
/var/log/secure # RHEL/CentOS 认证日志
/var/log/kern.log # 内核日志
/var/log/dmesg # 启动日志
/var/log/cron # 定时任务日志
# 使用 journalctl 查看日志
journalctl # 查看所有日志
journalctl -f # 实时查看
journalctl -u nginx # 查看服务日志
journalctl --since today # 今天的日志
journalctl -p err # 错误级别日志
journalctl -k # 内核日志
# 查看认证日志
sudo tail -f /var/log/auth.log
sudo grep "Failed password" /var/log/auth.log
sudo grep "Invalid user" /var/log/auth.log
# 查看系统启动日志
dmesg | less
dmesg | grep -i error
dmesg | grep -i fail
# 查看服务日志
sudo journalctl -u nginx -f
sudo tail -f /var/log/nginx/error.log日志分析技巧
bash
# 查找错误
grep -i "error\|fail\|critical" /var/log/syslog
# 统计错误类型
grep -o "error.*" /var/log/syslog | sort | uniq -c | sort -rn
# 查看特定时间段的日志
awk '/2024-01-15 10:00/,/2024-01-15 11:00/' /var/log/syslog
# 查找最近的错误
journalctl -p err -n 50
# 分析 Web 访问日志
# 统计访问量
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# 统计状态码
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 查找 404 错误
awk '$9 == "404" {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 查找慢请求
awk '$NF > 1 {print $0}' /var/log/nginx/access.log
# 分析 SSH 登录
# 失败登录
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn
# 成功登录
grep "Accepted password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn性能监控
CPU 性能
bash
# 查看 CPU 使用率
top
htop
# 查看 CPU 详细信息
lscpu
cat /proc/cpuinfo
# 查看 CPU 使用历史
sar -u 1 5
mpstat 1 5
# 查看高 CPU 进程
ps aux --sort=-%cpu | head
top -b -n 1 | head -20
# 查看进程 CPU 使用
pidstat -p ALL 1 5
# 查看系统负载
uptime
cat /proc/loadavg
# 查看中断
cat /proc/interrupts
watch -n 1 cat /proc/interrupts
# 查看上下文切换
vmstat 1 5
# 分析 CPU 性能问题
# 1. 高用户态 CPU:检查应用程序
# 2. 高内核态 CPU:检查系统调用、驱动
# 3. 高 I/O 等待:检查磁盘性能
# 4. 高负载:检查进程数和负载内存性能
bash
# 查看内存使用
free -h
cat /proc/meminfo
# 查看内存详细信息
vmstat -s
vmstat 1 5
# 查看内存使用历史
sar -r 1 5
# 查看高内存进程
ps aux --sort=-%mem | head
top -b -n 1 -o +%MEM | head -20
# 查看进程内存使用
pmap -x <pid>
cat /proc/<pid>/status | grep -i mem
# 查看内存映射
cat /proc/<pid>/maps
# 查看交换分区使用
swapon -s
cat /proc/swaps
# 查看内存压力
cat /proc/pressure/memory
# 查看内存泄漏
valgrind --leak-check=full ./program
# 清理缓存
sync
echo 3 > /proc/sys/vm/drop_caches
# 内存问题排查
# 1. 内存不足:检查大内存进程
# 2. 内存泄漏:使用 valgrind 检测
# 3. 交换分区使用高:增加内存或优化应用磁盘性能
bash
# 查看磁盘使用
df -h
df -i # inode 使用
# 查看目录大小
du -sh /*
du -h --max-depth=1 /
# 查看磁盘 I/O
iostat -x 1 5
iotop
# 查看进程 I/O
pidstat -d 1 5
iotop -o
# 查看块设备
lsblk
lsblk -f
# 查看磁盘统计
cat /proc/diskstats
# 磁盘性能测试
# 顺序读写
dd if=/dev/zero of=testfile bs=1M count=1024 conv=fdatasync
dd if=testfile of=/dev/null bs=1M
# 随机读写
fio --name=randread --ioengine=libaio --iodepth=16 --rw=randread --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
# 查找大文件
find / -type f -size +100M 2>/dev/null
du -ah / | sort -rh | head -20
# 磁盘问题排查
# 1. 磁盘满:清理文件或扩容
# 2. inode 满:删除小文件
# 3. I/O 高:检查 I/O 密集进程
# 4. 磁盘慢:检查磁盘健康网络性能
bash
# 查看网络连接
ss -tlnp
ss -s
# 查看网络统计
netstat -s
ip -s link
# 查看网络流量
iftop
nethogs
nload
# 查看网络延迟
ping -c 10 google.com
traceroute google.com
mtr google.com
# 网络带宽测试
# 安装 iperf3
sudo apt install iperf3
# 服务端
iperf3 -s
# 客户端
iperf3 -c server_ip
# DNS 解析测试
dig google.com
nslookup google.com
# 抓包分析
tcpdump -i eth0 port 80
tcpdump -i eth0 host 192.168.1.100
tcpdump -i eth0 -w capture.pcap
# 查看网络连接状态
ss -tan | awk '{print $1}' | sort | uniq -c
# 网络问题排查
# 1. 无网络:检查网卡配置、网线
# 2. DNS 问题:检查 /etc/resolv.conf
# 3. 端口不通:检查防火墙、服务状态
# 4. 网络慢:检查带宽、延迟、丢包常见问题排查
系统启动问题
bash
# 查看启动日志
journalctl -b
dmesg
# 查看启动时间
systemd-analyze time
systemd-analyze blame
# 查看启动失败的服务
systemctl --failed
# 进入救援模式
sudo systemctl rescue
# 进入紧急模式
sudo systemctl emergency
# 修复 GRUB
# 从 Live USB 启动
sudo mount /dev/sda1 /mnt
sudo chroot /mnt
grub-install /dev/sda
update-grub
# 修复文件系统
sudo fsck /dev/sda1
# 重置 root 密码
# 重启进入单用户模式
# 在 GRUB 编辑内核参数添加:init=/bin/bash
mount -o remount,rw /
passwd root服务问题
bash
# 查看服务状态
systemctl status nginx
# 查看服务日志
journalctl -u nginx
# 检查服务配置
nginx -t
apachectl configtest
# 检查端口占用
ss -tlnp | grep :80
lsof -i :80
# 检查进程
ps aux | grep nginx
# 检查 SELinux/AppArmor
getenforce
sudo aa-status
# 测试服务连接
curl -I http://localhost
telnet localhost 80
# 服务无法启动排查步骤
# 1. 检查配置文件语法
# 2. 检查端口是否被占用
# 3. 检查权限和用户
# 4. 检查依赖服务
# 5. 检查 SELinux/AppArmor
# 6. 查看详细日志网络问题
bash
# 检查网络接口
ip link show
ip addr show
# 检查路由
ip route show
# 检查 DNS
cat /etc/resolv.conf
dig google.com
# 检查防火墙
sudo ufw status
sudo firewall-cmd --list-all
sudo iptables -L -n
# 测试网络连通性
ping -c 4 8.8.8.8
ping -c 4 google.com
# 追踪路由
traceroute 8.8.8.8
# 检查 NAT
sudo iptables -t nat -L -n
# 网络问题排查步骤
# 1. 检查网卡状态
# 2. 检查 IP 配置
# 3. 检查路由
# 4. 检查 DNS
# 5. 检查防火墙
# 6. 测试连通性磁盘问题
bash
# 检查磁盘空间
df -h
# 检查 inode
df -i
# 检查大文件
du -h --max-depth=1 / | sort -rh
# 检查被删除但未释放空间的文件
lsof | grep deleted
# 检查磁盘健康
sudo smartctl -a /dev/sda
# 检查文件系统
sudo fsck -n /dev/sda1
# 检查磁盘错误
sudo badblocks -v /dev/sda
# 磁盘问题排查步骤
# 1. 检查磁盘空间
# 2. 检查 inode 使用
# 3. 查找大文件
# 4. 清理日志和缓存
# 5. 检查磁盘健康内存问题
bash
# 检查内存使用
free -h
# 检查内存详情
cat /proc/meminfo
# 检查内存进程
ps aux --sort=-%mem | head
# 检查交换分区
swapon -s
# 检查 OOM 日志
dmesg | grep -i "out of memory"
journalctl | grep -i "out of memory"
# 释放缓存
sync
echo 3 > /proc/sys/vm/drop_caches
# 内存问题排查步骤
# 1. 检查内存使用
# 2. 找出高内存进程
# 3. 检查是否有内存泄漏
# 4. 检查 OOM 日志
# 5. 考虑增加内存或优化应用性能分析工具
综合监控工具
bash
# top - 实时监控
top
htop
# glances - 综合监控
sudo apt install glances
glances
# dstat - 综合统计
sudo apt install dstat
dstat
# vmstat - 系统统计
vmstat 1 5
# sar - 系统活动报告
sar -u 1 5 # CPU
sar -r 1 5 # 内存
sar -d 1 5 # 磁盘
sar -n DEV 1 5 # 网络
# sysstat - 系统统计套件
sudo apt install sysstat进程分析工具
bash
# strace - 跟踪系统调用
strace -p <pid>
strace -c -p <pid> # 统计模式
# ltrace - 跟踪库函数调用
ltrace -p <pid>
# lsof - 列出打开的文件
lsof -p <pid>
lsof -i :80
# pstack - 查看进程栈
pstack <pid>
# gdb - 调试工具
gdb -p <pid>
# perf - 性能分析
perf top
perf record -g -p <pid>
perf report网络分析工具
bash
# tcpdump - 抓包
tcpdump -i eth0 port 80
tcpdump -i eth0 host 192.168.1.100
# wireshark - 图形化抓包分析
sudo apt install wireshark
# nmap - 端口扫描
nmap -sT localhost
nmap -sU localhost
# netcat - 网络工具
nc -zv localhost 80
nc -l 1234 # 监听端口
nc localhost 1234 # 连接端口
# curl - HTTP 客户端
curl -I http://localhost
curl -v http://localhost
# mtr - 网络诊断
mtr google.com故障排查脚本
系统诊断脚本
bash
#!/bin/bash
# 系统诊断脚本
echo "========== 系统诊断报告 =========="
echo "生成时间:$(date)"
echo ""
# 系统信息
echo "--- 系统信息 ---"
uname -a
hostnamectl 2>/dev/null || cat /etc/os-release
echo ""
# CPU 使用
echo "--- CPU 使用 ---"
top -b -n 1 | head -15
echo ""
# 内存使用
echo "--- 内存使用 ---"
free -h
echo ""
# 磁盘使用
echo "--- 磁盘使用 ---"
df -h
echo ""
# 网络连接
echo "--- 网络连接 ---"
ss -s
echo ""
# 系统负载
echo "--- 系统负载 ---"
uptime
echo ""
# 失败的服务
echo "--- 失败的服务 ---"
systemctl --failed
echo ""
# 最近登录
echo "--- 最近登录 ---"
last | head -10
echo ""
# 最近错误日志
echo "--- 最近错误日志 ---"
journalctl -p err -n 20 --no-pager
echo ""
echo "========== 诊断完成 =========="服务检查脚本
bash
#!/bin/bash
# 服务检查脚本
SERVICES=("nginx" "mysql" "redis")
for service in "${SERVICES[@]}"; do
if systemctl is-active --quiet "$service"; then
echo "[OK] $service 运行正常"
else
echo "[FAIL] $service 未运行"
echo "尝试启动 $service..."
sudo systemctl start "$service"
sleep 2
if systemctl is-active --quiet "$service"; then
echo "[OK] $service 启动成功"
else
echo "[FAIL] $service 启动失败"
echo "查看日志:"
journalctl -u "$service" -n 10 --no-pager
fi
fi
done网络诊断脚本
bash
#!/bin/bash
# 网络诊断脚本
echo "========== 网络诊断 =========="
# 检查网络接口
echo "--- 网络接口 ---"
ip -br a
echo ""
# 检查路由
echo "--- 路由表 ---"
ip route show
echo ""
# 检查 DNS
echo "--- DNS 配置 ---"
cat /etc/resolv.conf
echo ""
# 测试 DNS 解析
echo "--- DNS 解析测试 ---"
dig google.com +short
echo ""
# 测试网络连通性
echo "--- 网络连通性测试 ---"
ping -c 4 8.8.8.8
echo ""
# 测试外网连接
echo "--- 外网连接测试 ---"
curl -I --connect-timeout 5 https://google.com 2>&1 | head -5
echo ""
# 检查防火墙
echo "--- 防火墙状态 ---"
sudo ufw status 2>/dev/null || sudo firewall-cmd --state 2>/dev/null || echo "防火墙未配置"
echo ""
# 检查监听端口
echo "--- 监听端口 ---"
ss -tlnp
echo ""
echo "========== 诊断完成 =========="小结
本章介绍了 Linux 故障排查:
| 内容 | 工具 | 功能 |
|---|---|---|
| 日志分析 | journalctl, grep | 分析系统日志 |
| CPU 监控 | top, htop, mpstat | CPU 性能分析 |
| 内存监控 | free, vmstat | 内存性能分析 |
| 磁盘监控 | df, iostat, iotop | 磁盘性能分析 |
| 网络监控 | ss, iftop, tcpdump | 网络性能分析 |
故障排查清单
bash
# 1. 收集信息
# - 查看错误日志
# - 检查系统状态
# - 确认问题范围
# 2. 分析原因
# - CPU/内存/磁盘/网络
# - 配置文件
# - 权限问题
# 3. 解决问题
# - 应用修复方案
# - 验证修复结果
# 4. 预防复发
# - 记录问题和解决方案
# - 设置监控告警
# - 定期维护检查常用诊断命令
bash
# 系统状态
top # CPU 和内存
df -h # 磁盘空间
free -h # 内存使用
ss -tlnp # 网络端口
# 日志查看
journalctl -f # 实时日志
journalctl -u nginx # 服务日志
dmesg # 内核日志
# 性能分析
iostat -x 1 # 磁盘 I/O
vmstat 1 # 内存统计
mpstat 1 # CPU 统计恭喜你完成了 Linux 教程的学习!通过本教程,你已经掌握了 Linux 系统的基础知识和核心技能,可以开始在实际工作中使用 Linux 了。
