Skip to content

故障排查

本章将介绍 Linux 系统故障排查的方法和工具,包括日志分析、性能监控、常见问题诊断和解决方案,帮助你快速定位和解决系统问题。

故障排查方法论

排查流程

mermaid
graph TD
    A[发现问题] --> B[收集信息]
    B --> C[分析原因]
    C --> D[制定方案]
    D --> E[实施修复]
    E --> F[验证结果]
    F --> G{问题解决?}
    G -->|否| C
    G -->|是| H[记录总结]

排查原则

  1. 先易后难:从最简单、最可能的原因开始排查
  2. 由近及远:先检查最近的变更,再检查历史问题
  3. 由表及里:从表面现象逐步深入到系统内部
  4. 隔离问题:缩小问题范围,排除干扰因素
  5. 保留现场:在修复前收集必要的信息

日志分析

系统日志

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, mpstatCPU 性能分析
内存监控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 了。