1. Linux系统排障的核心思路
作为一名运维工程师,我处理过上千次Linux系统故障。很多人遇到问题就急着搜索解决方案,却忽略了系统化排障的重要性。正确的排障流程应该像医生诊断病情一样:先观察症状,再检查关键指标,最后对症下药。
Linux系统的故障大致可以分为五类:
- 性能问题(CPU/内存/磁盘/网络过载)
- 服务异常(进程崩溃、端口占用)
- 启动故障(内核panic、文件系统损坏)
- 权限问题(SELinux、文件权限)
- 网络连接(防火墙、路由、DNS)
重要提示:永远先执行
dmesg -T查看内核日志,这里往往藏着最直接的故障线索。时间戳参数-T能让日志更易读。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 性能问题的诊断与修复
2.1 CPU过载排查实战
上周我们的生产服务器突然出现响应迟缓,通过以下步骤定位到问题:
- 使用
top命令观察CPU使用率,发现kworker进程持续占用300%CPU(32核机器) - 安装
perf工具进行深度分析:bash复制
perf top -g -p [PID] - 发现是ext4文件系统的journaling线程异常活跃
- 最终通过
fsck修复磁盘元数据解决问题
关键工具对比:
| 工具 | 适用场景 | 示例命令 |
|---|---|---|
| top | 实时进程监控 | top -c -p 1234 |
| vmstat | 系统级资源统计 | vmstat 1 5 |
| pidstat | 进程级详细统计 | pidstat -u 1 3 -p 5678 |
2.2 内存泄漏精准定位
当发现free -h显示可用内存持续下降时:
- 安装
smem工具分析实际内存占用:bash复制smem -t -k -P "nginx" - 使用
valgrind检测应用程序内存泄漏(需重新编译) - 对于Java应用,
jmap -histo:live [pid]能显示堆内存详情
经验之谈:
/proc/meminfo中的Slab项突然增大,往往是内核内存泄漏的信号。
3. 服务异常的深度处理
3.1 服务崩溃的自动恢复
通过systemd的看门狗机制实现服务自动重启:
ini复制[Service]
Restart=on-failure
RestartSec=5s
WatchdogSec=30s
检查服务状态的正确姿势:
bash复制systemctl status --no-pager -l nginx
journalctl -u nginx -f --since "1 hour ago"
3.2 端口冲突的终极解决方案
当遇到Address already in use错误时:
- 找出占用端口的进程:
bash复制
ss -tulnp | grep 80 - 如果确实是僵尸进程:
bash复制echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse - 终极方案:使用
socat端口转发绕过冲突
4. 启动故障的修复秘籍
4.1 GRUB救援模式实操
当系统无法启动时,最常见的修复步骤:
- 在GRUB界面按
e编辑启动参数 - 在
linux行末尾添加:code复制init=/bin/bash - 挂载文件系统为可写:
bash复制
mount -o remount,rw / - 修复fstab或重建initramfs:
bash复制
dracut --force
4.2 文件系统修复进阶
针对不同的文件系统损坏:
- ext4:
fsck -y /dev/sda1 - xfs:
xfs_repair -L /dev/sdb2 - btrfs:
btrfs rescue super-recover /dev/sdc1
严重警告:修复前务必先做磁盘镜像!
dd if=/dev/sda of=/mnt/backup/sda.img bs=1M
5. 网络连接的疑难杂症
5.1 DNS解析故障排查链
当出现Name or service not known错误时:
- 检查基础配置:
bash复制cat /etc/resolv.conf nmcli dev show | grep DNS - 使用
dig进行分级诊断:bash复制
dig +trace example.com - 测试不同DNS服务器:
bash复制
drill @8.8.8.8 example.com
5.2 防火墙规则的精确定位
快速诊断防火墙问题:
bash复制iptables -L -n -v --line-numbers
nft list ruleset
临时放行特定流量(生产环境慎用):
bash复制tcpdump -i eth0 port 3306 -w mysql.pcap
6. 权限问题的终极指南
6.1 SELinux故障处理流程
当看到Permission denied但普通权限正常时:
- 检查SELinux状态:
bash复制
sestatus getenforce - 查看审计日志:
bash复制
ausearch -m avc -ts recent - 临时解决方案:
bash复制
setenforce 0 - 永久修复:
bash复制semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" restorecon -Rv /web
6.2 文件权限的完美配置
推荐的安全权限设置:
bash复制find /var/www -type d -exec chmod 750 {} \;
find /var/www -type f -exec chmod 640 {} \;
chown -R www-data:www-data /var/www
特殊权限标志解析:
- setuid:
chmod u+s /usr/bin/passwd - setgid:
chmod g+s /shared_dir - sticky bit:
chmod +t /tmp
7. 终极排障工具包
7.1 必须安装的诊断工具
我的应急工具清单:
bash复制# 基础工具
apt install sysstat dstat iotop iftop htop ncdu
# 高级诊断
apt install strace ltrace perf bpftrace sysdig
# 网络专项
apt install tcpdump wireshark nmap mtr
7.2 自制诊断脚本示例
快速系统健康检查脚本:
bash复制#!/bin/bash
echo "===== $(date) ====="
echo "CPU: $(uptime)"
echo "Memory: $(free -h)"
echo "Disk: $(df -h | grep -v tmpfs)"
echo "Top processes:"
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 5
保存为/usr/local/bin/healthcheck并添加执行权限。
8. 排障工程师的自我修养
经过多年实战,我总结出这些黄金法则:
-
永远先看日志!按顺序检查:
/var/log/messages/var/log/syslog- 应用专属日志(如
/var/log/nginx/error.log)
-
最小化复现原则:尝试在测试环境复现问题
-
变更控制:任何修改前先备份相关配置
-
文档习惯:建立自己的排障知识库
最后分享一个真实案例:某次MySQL连接缓慢,最终发现是IPv6解析超时导致,在/etc/gai.conf中添加precedence ::ffff:0:0/96 100立即解决问题。这提醒我们——有时最不起眼的配置才是关键。
