Linux 故障排查实战:十大常见问题解决指南
服务器故障随时可能发生,快速准确地定位和解决问题是运维人员的核心能力。本文总结 Linux 运维中最常见的十大故障场景及解决方案,帮助您提升故障排查效率。
一、CPU 占用过高
症状
- 系统响应缓慢
- top 命令显示 CPU 使用率接近 100%
排查步骤
# 1. 查看进程 CPU 使用 top -H # 显示线程 # 2. 找出高 CPU 进程 ps aux --sort=-%cpu | head -10 # 3. 查看线程详情 ps -eLf | grep PID # 4. 性能分析 perf top -p PID # 5. 如果是死循环,可以临时停止进程 kill -STOP PID # 暂停进程 kill -CONT PID # 恢复进程 # 6. 必要时重启服务 systemctl restart nginx
常见原因
- 死循环代码
- 数据库查询未优化
- 恶意挖矿程序
二、内存不足
症状
- 系统频繁使用 Swap
- OOM Killer 杀进程
排查步骤
# 1. 查看内存使用 free -h # 2. 查看进程内存使用 ps aux --sort=-%mem | head -10 # 3. 查看内存详细信息 cat /proc/meminfo # 4. 查看系统日志中的 OOM Killer grep "Out of memory" /var/log/messages # 5. 清理缓存 sync && echo 3 > /proc/sys/vm/drop_caches # 6. 重启占用内存多的服务 systemctl restart mysql
预防措施
# 配置 Swap 使用频率 echo "vm.swappiness=10" >> /etc/sysctl.conf # 限制进程内存 ulimit -v 2097152 # 限制为 2GB
三、磁盘空间不足
症状
- df -h 显示磁盘使用率 100%
- 无法写入文件
排查步骤
# 1. 查看磁盘使用 df -h # 2. 查找大文件 find / -type f -size +1G 2>/dev/null # 3. 查看目录大小 du -sh /* | sort -rh | head -20 # 4. 清理日志文件 > /var/log/nginx/access.log # 5. 清理旧备份 find /backup -name "*.tar.gz" -mtime +30 -delete # 6. 清理 Docker 资源 docker system prune -a --volumes
四、磁盘 IO 瓶颈
症状
- iowait 高
- 数据库查询慢
排查步骤
# 1. 查看 IO 等待 iostat -x 1 5 # 2. 找出高 IO 进程 iotop # 3. 查看磁盘读写速度 dd if=/dev/zero of=/tmp/test bs=1G count=1 oflag=direct # 4. 优化数据库索引 mysql> OPTIMIZE TABLE table_name;
五、网络连接问题
症状
- 无法连接服务器
- 服务无法访问
排查步骤
# 1. 检查网络连通性 ping target_ip # 2. 检查端口是否开放 telnet target_ip port nc -zv target_ip port # 3. 查看监听端口 netstat -tulpn ss -tulpn # 4. 检查防火墙 iptables -L -n -v firewall-cmd --list-all # 5. 检查路由 traceroute target_ip # 6. 抓包分析 tcpdump -i eth0 host target_ip and port 80
六、服务无法启动
症状
- systemctl start 失败
- 服务启动后立即退出
排查步骤
# 1. 查看服务状态 systemctl status nginx # 2. 查看详细日志 journalctl -u nginx -f # 3. 检查配置文件 nginx -t # 4. 查看端口占用 lsof -i :80 ss -tulpn | grep :80 # 5. 手动启动查看错误 /usr/sbin/nginx -g 'daemon off;'
七、数据库连接数耗尽
症状
- 应用报 “Too many connections”
- 数据库无法连接
排查步骤
# MySQL mysql> SHOW PROCESSLIST; mysql> SHOW VARIABLES LIKE 'max_connections'; # 杀掉长时间查询 mysql> KILL PID; # 增加连接数 vim /etc/mysql/my.cnf max_connections = 1000 systemctl restart mysql
八、僵尸进程
症状
- ps aux 显示很多
进程 - 系统资源占用正常但进程数异常
排查步骤
# 1. 查找僵尸进程 ps aux | grep defunct # 2. 查找僵尸进程的父进程 ps -eo pid,ppid,stat,comm | grep Z # 3. 杀掉父进程(谨慎) kill -9 PARENT_PID # 4. 或向父进程发送 SIGCHLD kill -SIGCHLD PARENT_PID
九、时间同步问题
症状
- 系统时间不准
- 日志时间戳错误
排查步骤
# 1. 查看当前时间 date # 2. 安装并启动 NTP sudo apt install ntp sudo systemctl start ntp # 3. 手动同步 sudo ntpdate -u time.nist.gov # 4. 设置时区 sudo timedatectl set-timezone Asia/Shanghai
十、DNS 解析问题
症状
- 域名无法解析
- ping 域名失败但 IP 能通
排查步骤
# 1. 查看当前 DNS 配置 cat /etc/resolv.conf # 2. 测试 DNS 解析 nslookup example.com dig example.com # 3. 修改 DNS 服务器 vim /etc/resolv.conf nameserver 8.8.8.8 nameserver 114.114.114.114 # 4. 测试连通性 ping 8.8.8.8 # 5. 清除 DNS 缓存 systemctl restart systemd-resolved
故障排查技巧总结
- 保持冷静:先确认问题范围,避免盲目操作
- 查看日志:日志通常包含问题的直接线索
- 使用工具:熟练使用 top、df、netstat、tcpdump 等工具
- 记录过程:记录排查过程和解决方案,便于日后参考
- 备份配置:修改前先备份配置文件
- 测试恢复:故障解决后进行测试验证
总结
故障排查是运维人员的日常核心工作。建立系统的排查思路,熟练使用各种工具,积累实战经验,才能在故障发生时快速定位和解决问题。定期进行故障演练,提升应急响应能力。
