1. Linux故障排查的核心思路
作为一名在Linux系统管理领域摸爬滚打多年的老运维,我处理过上千次系统故障。很多人遇到Linux问题就慌了手脚,其实排查故障就像医生看病一样需要系统性的诊断方法。这里分享我总结的"望闻问切"四步法:
望(观察症状):先别急着敲命令,记录下所有异常现象。比如系统是否还能响应?错误信息是什么?最近做过什么变更?我习惯用手机拍下报错屏幕,因为很多错误信息一闪而过。
闻(收集日志):Linux系统的日志系统就像飞机的黑匣子。关键日志位置包括:
- /var/log/messages(系统主日志)
- /var/log/syslog(Ubuntu系专用)
- /var/log/dmesg(内核日志)
- 各服务专用日志(如/var/log/nginx/)
问(追溯历史):用history命令查看近期操作,特别关注:
- 软件安装/卸载记录(rpm/dpkg日志)
- 配置文件修改(通过
grep -r "修改内容" /etc/搜索) - 定时任务变更(crontab -l)
切(工具诊断):根据症状选择工具,就像中医把脉:
- 系统负载高?用
top然后按1看各CPU核心 - 内存泄漏?
free -h配合smem -s swap - 磁盘问题?
iostat -x 1看IO等待 - 网络异常?
ss -tulnp比netstat更高效
重要提示:永远先备份再操作!我吃过亏后才养成习惯:动关键配置前先用
cp filename{,.bak}创建备份。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高频故障场景实战处理
2.1 系统无法启动的急救方案
上周才处理过一个典型案例:服务器重启后卡在GRUB界面。这种问题通常有三种可能:
GRUB损坏:
bash复制# 进入救援模式后
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
文件系统损坏:
bash复制fsck -y /dev/sda1 # 交互式修复
xfs_repair /dev/sda2 # 针对XFS文件系统
内核参数错误:
在GRUB界面按e编辑启动参数,重点检查:
- root= 指定的设备是否正确
- 是否有拼写错误的内核参数
- 删除可能冲突的驱动模块
2.2 磁盘空间爆满的排查技巧
收到"no space left"报警时,别急着删文件。我常用的排查顺序:
- 快速定位大文件:
bash复制du -h --max-depth=1 / | sort -h # 查看根目录占用
ncdu /var # 交互式可视化分析(需安装)
- 处理日志文件:
bash复制journalctl --vacuum-size=200M # 限制journal日志大小
logrotate -f /etc/logrotate.conf # 手动执行日志轮转
- 特殊文件处理:
- 已删除但未释放的文件:
lsof | grep deleted找到进程后重启 - 稀疏文件:
fallocate -d bigfile释放空洞空间
2.3 网络连接故障的深度排查
当应用连不上数据库或API时,按这个流程走:
基础检查:
bash复制ping target_host # 检测基础连通性
traceroute -T -p 443 target_host # TCP方式跟踪路由
端口级诊断:
bash复制telnet target_host 3306 # 测试MySQL端口
nc -zv target_host 5432 # 测试PostgreSQL端口
高级工具:
bash复制tcpdump -i eth0 'port 80' -w capture.pcap # 抓包分析
ss -tulnp | grep nginx # 检查端口监听状态
3. 性能问题排查工具箱
3.1 CPU性能分析实战
遇到CPU跑满时,我常用的组合拳:
- 快速定位:
bash复制top -c -o %CPU # 按CPU排序进程
pidstat 1 5 -u # 每1秒采样,共5次
- 热点分析:
bash复制perf top -p <pid> # 实时函数级监控
strace -cp <pid> # 统计系统调用
- 火焰图生成:
bash复制perf record -F 99 -g -p <pid> -- sleep 30
perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > cpu.svg
3.2 内存泄漏排查方法
Java应用的内存泄漏排查步骤:
- 确认现象:
bash复制jstat -gcutil <pid> 1000 # 监控GC情况
free -h # 观察系统内存变化
- 堆转储分析:
bash复制jmap -dump:live,format=b,file=heap.hprof <pid>
# 用MAT或jvisualvm分析hprof文件
- Native内存排查:
bash复制pmap -x <pid> # 查看内存映射
valgrind --leak-check=full ./program # 对C程序更有效
4. 疑难杂症处理经验录
4.1 服务启动失败的隐藏原因
遇到过最诡异的案例:Nginx重启后监听不了80端口。最后发现是SELinux在作祟:
bash复制# 查看SELinux日志
grep nginx /var/log/audit/audit.log | audit2why
# 临时解决方案
setenforce 0 # 禁用SELinux(不推荐)
# 正确解决方案
semanage port -a -t http_port_t -p tcp 8080 # 添加端口规则
restorecon -Rv /etc/nginx/ # 修复文件上下文
4.2 文件描述符耗尽问题
某次线上事故报警"too many open files",处理过程:
- 确认限制值:
bash复制ulimit -n # 查看当前会话限制
cat /proc/<pid>/limits # 查看进程实际限制
- 修改系统级配置:
bash复制echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
- 应用级优化:
- 检查代码中未关闭的文件流
- 使用连接池管理数据库连接
- 调整Nginx的worker_connections参数
4.3 时间不同步引发的血案
分布式系统中时间不同步会导致各种诡异问题。我的处理方案:
基础检查:
bash复制timedatectl status # 查看时区和同步状态
ntpstat # 检查NTP同步情况
强制同步:
bash复制systemctl stop chronyd # 停止时间服务
ntpdate pool.ntp.org # 手动同步
systemctl start chronyd
长期方案:
bash复制# 配置chrony(现代Linux推荐)
cat > /etc/chrony.conf <<EOF
server ntp.aliyun.com iburst
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
EOF
最后分享一个真实教训:曾经因为跳过了"先备份再操作"的步骤,导致误删生产数据库。现在我的终端里常年开着这个别名:
bash复制alias risky='echo "DANGER! Did you: 1) Backup 2) Test in staging? [y/N]" && read confirm && [[ $confirm == "y" ]] || exit 1'
