引言
当Linux系统"生病"时,它不会说话但却会通过各种症状"求救"🆘!本文将带你建立系统化的故障排查思维,从磁盘到内存,从网络到服务,全方位掌握Linux系统的"把脉问诊"技巧。无论遇到多么诡异的系统问题,这篇文章都会成为你的"急诊手册"!准备好你的终端,让我们一起成为Linux系统的"全能医生"吧~ 🚑
一、系统级故障排查框架
1.1 通用排查流程
- 现象确认:明确故障表现(服务不可用、性能下降、报错信息等)
- 日志分析:检查系统日志(
/var/log/
)和应用日志 - 资源监控:查看CPU、内存、磁盘、网络使用情况
- 隔离定位:通过排除法确定问题组件
- 复现测试:尝试复现问题以确认根本原因
1.2 常用诊断命令
# 系统状态概览
uptime # 负载情况
dmesg | tail # 内核日志
journalctl -xe # 系统日志(systemd系统)# 资源快速检查
top # 动态资源监控
df -h # 磁盘空间
free -h # 内存使用
ss -tulnp # 网络连接
二、磁盘相关故障
2.1 常见磁盘错误
- “No space left on device”:磁盘空间不足
- “Input/output error”:磁盘I/O错误
- “Read-only file system”:文件系统变为只读
- “Disk quota exceeded”:磁盘配额超限
2.2 排查步骤
# 1. 检查磁盘空间
df -h # 查看各分区使用率
df -i # 检查inode使用情况# 2. 查找大文件
du -sh /* # 查看根目录下各目录大小
find / -type f -size +100M -exec ls -lh {} + | sort -rh# 3. 检查文件系统错误
sudo fsck /dev/sda1 # 需要先umount# 4. 检查磁盘健康(SMART)
sudo smartctl -a /dev/sda# 5. 检查挂载选项
mount | grep /dev/sda1
cat /etc/fstab
2.3 解决方案
-
空间不足:
# 清理日志/缓存 sudo journalctl --vacuum-size=100M # 限制日志大小 sudo apt clean # Debian/Ubuntu清理包缓存# 扩容或添加存储 lvextend -L +10G /dev/vg_data/lv_home # LVM扩容 resize2fs /dev/vg_data/lv_home
-
文件系统损坏:
umount /dev/sda1 fsck -y /dev/sda1 mount /dev/sda1
三、内存相关故障
3.1 常见内存错误
- “Out of memory”:内存耗尽
- “Killed process”:OOM Killer终止进程
- “Cannot allocate memory”:内存分配失败
- 系统卡顿/交换频繁:内存不足表现
3.2 排查步骤
# 1. 检查内存使用
free -h # 查看物理内存和交换空间
vmstat 1 # 监控虚拟内存统计# 2. 查看内存占用进程
top # 按内存排序(M)
ps aux --sort=-%mem | head# 3. 检查OOM事件
dmesg | grep -i oom # 查看OOM Killer日志
journalctl -k | grep -i oom# 4. 检查内核参数
sysctl vm.swappiness
cat /proc/sys/vm/overcommit_memory
3.3 解决方案
-
优化内存使用:
# 调整swappiness sudo sysctl vm.swappiness=10# 限制进程内存 systemctl set-property apache2 MemoryLimit=1G
-
处理内存泄漏:
# 使用valgrind检测 valgrind --leak-check=yes ./application# 定期重启有内存泄漏的服务 sudo systemctl restart service_name
四、网络相关故障
4.1 常见网络错误
- “Network is unreachable”:网络不可达
- “Connection refused”:目标服务未监听
- “No route to host”:路由问题
- “Name or service not known”:DNS解析失败
- 高延迟/丢包:网络质量问题
4.2 排查步骤
# 1. 检查网络配置
ip addr show # 查看IP地址
ip route show # 查看路由表
cat /etc/resolv.conf # 检查DNS配置# 2. 测试基本连通性
ping 8.8.8.8 # 测试基础网络
ping google.com # 测试DNS解析# 3. 检查端口连通性
telnet example.com 80
nc -zv example.com 443# 4. 追踪网络路径
traceroute google.com
mtr google.com # 更高级的路由追踪# 5. 检查防火墙规则
sudo iptables -L -n # iptables规则
sudo firewall-cmd --list-all # firewalld规则
4.3 解决方案
-
DNS问题:
# 检查/etc/resolv.conf nameserver 8.8.8.8 nameserver 1.1.1.1# 测试不同DNS服务器 dig @8.8.8.8 example.com
-
防火墙阻挡:
# 临时添加规则 sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT# 永久保存规则 sudo iptables-save > /etc/iptables.rules
-
网络接口问题:
# 重启网络服务 sudo systemctl restart networking # Debian/Ubuntu sudo systemctl restart NetworkManager # RHEL/CentOS# 检查接口状态 ethtool eth0
五、服务特定故障
5.1 服务启动失败
# 1. 查看服务状态
systemctl status apache2# 2. 查看详细日志
journalctl -u apache2 -xe# 3. 测试配置文件语法
apachectl configtest # Apache
nginx -t # Nginx# 4. 检查端口冲突
ss -tulnp | grep :80
5.2 数据库连接问题
# 1. 检查服务状态
systemctl status mysql# 2. 检查错误日志
tail -f /var/log/mysql/error.log# 3. 检查连接限制
show variables like 'max_connections';# 4. 检查网络访问权限
SELECT host, user FROM mysql.user;
六、硬件相关故障
6.1 常见硬件错误
- “kernel: CPU#0: Possible thermal throttling”:CPU过热
- “blk_update_request: I/O error”:磁盘I/O错误
- “EDAC MC0: UE memory read error”:内存错误
6.2 排查命令
# CPU/温度监控
sensors # 需要安装lm-sensors
mpstat -P ALL 1 # CPU使用率# 内存检测
sudo memtester 1G 1 # 测试1GB内存(需安装memtester)# 磁盘健康
sudo smartctl -a /dev/sda
sudo badblocks -v /dev/sda
七、系统崩溃分析
7.1 内核崩溃(crash)
# 查看内核转储
ls -lh /var/crash/ # Ubuntu
ls -lh /var/core/ # RHEL/CentOS# 分析core dump
gdb /usr/bin/application core-file# 配置kdump(内核转储)
sudo kdump-config show # Debian/Ubuntu
7.2 系统日志分析
# 查看关键错误
grep -i error /var/log/syslog
journalctl -p 3 -xb # 显示错误级别及以上日志# 按时间筛选
journalctl --since "2023-01-01" --until "2023-01-02"
八、性能问题排查
8.1 CPU瓶颈
# 1. 查看CPU负载
top
htop# 2. 分析热点进程
perf top# 3. 追踪系统调用
strace -p <PID> -c
8.2 I/O瓶颈
# 1. 查看磁盘I/O
iostat -xz 1# 2. 查看I/O等待
vmstat 1# 3. 查找高IO进程
iotop
九、故障排查工具箱
9.1 必备工具列表
工具 | 用途 |
---|---|
strace | 跟踪系统调用 |
ltrace | 跟踪库调用 |
lsof | 列出打开文件 |
tcpdump | 网络抓包 |
sysdig | 系统监控和排错 |
bpftrace | 高级性能分析 |
9.2 诊断脚本示例
#!/bin/bash
# 快速系统诊断脚本echo "===== System Overview ====="
uptime
echo -e "\n===== Disk Usage ====="
df -h
echo -e "\n===== Memory Usage ====="
free -h
echo -e "\n===== Top Processes ====="
ps aux --sort=-%cpu | head -10
echo -e "\n===== Recent Errors ====="
journalctl -xe -n 20 --no-pager
总结 🎯
通过本文的系统学习,我们已经构建了完整的Linux故障排查知识体系:
- 系统化思维:从现象到根源的推理方法 🧠
- 分层诊断:硬件→系统→服务的检查路径 🔍
- 工具链应用:各类专业诊断工具的使用 🛠️
- 应急方案:崩溃恢复与数据抢救技巧 🚑
排障黄金法则:
- 先备份再操作:重要数据优先保护 💾
- 最小变动原则:一次只改一个变量 🔧
- 日志为王:系统日志是最佳线索 📜
记住:优秀的运维工程师都是经验丰富的侦探! 现在就去实践这些排查技巧吧!🐧✨
PS:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!😄