故障排查的黄金法则

服务器出问题不要慌,按这个顺序排查:先整体后局部,先系统后应用,先看日志再看配置。90% 的问题都能通过下面这套 SOP 定位到。

场景一:服务器突然变卡

1. 先看整体负载

第一步永远是 tophtop

top

关注三个数字(Load Average):0.50, 0.80, 1.20。这三个值分别代表 1 分钟、5 分钟、15 分钟的平均负载。如果第一个数字远大于 CPU 核心数,说明系统过载了。

2. 定位高 CPU 进程

在 top 界面按 P(大写)按 CPU 使用率排序,最上面的就是元凶。记下它的 PID。

也可以用 ps 命令:

ps aux --sort=-%cpu | head -10

找到进程后,用 strace -p PID 看看它在做什么系统调用。

3. 如果是内存问题

free -h

注意 available 列,不是 free 列。Linux 会把空闲内存拿来做缓存,free 值小是正常的。available 接近 0 才是真不够了。

找内存大户:

ps aux --sort=-%mem | head -10

场景二:磁盘空间满了

1. 确认磁盘状态

df -h

如果某分区 Use% 到 100%,马上清理。先定位是哪个目录占用了大量空间:

du -sh /* 2>/dev/null | sort -rh | head -10

这条命令列出根目录下各子目录的大小,从大到小排列。通常罪魁祸首是 /var/log(日志)或 /tmp(临时文件)。

2. 清理日志文件

删除超过 30 天的日志:

find /var/log -name "*.log" -mtime +30 -delete

查找大于 100MB 的文件:

find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

3. inode 耗尽也要注意

有时候 df -h 显示还有空间但写不进去文件,可能是 inode 用完了:

df -i

场景三:网络不通

1. 本地网络是否正常

ping -c 4 8.8.8.8

如果能 ping 通外网 IP 但域名不通→ DNS 问题,检查 /etc/resolv.conf

2. 端口是否在监听

netstat -tlnp

或使用更快的 ss -tlnp。确认你的服务端口是否在 LISTEN 状态。

3. 查看正在使用的端口

lsof -i :80

看看 80 端口被哪个进程占用了。如果一个端口被意外占用,可以用 kill 终止它。

4. 真连不上?抓包分析

tcpdump -i eth0 port 80 -nn -A

看 HTTP 请求到底发出去没有、有没有收到响应。

场景四:服务起不来

1. 看日志是第一要务

systemd 管理的服务:

journalctl -u nginx -n 50 --no-pager

查看最近的 50 条 nginx 日志,通常错误信息会直接告诉你原因。

传统日志文件:

tail -f /var/log/nginx/error.log

2. 检查端口冲突

最常见的原因是端口被占用。用上面的 lsof -i :端口号 检查。

3. 检查配置文件语法

以 Nginx 为例:

nginx -t

大多数服务都有类似的配置检查命令,改完配置后先检查再重启。

终极大招:系统日志

实在找不到原因时,这两条命令能救命:

dmesg | tail -50
tail -100 /var/log/syslog

内核消息和系统日志包含了所有硬件、驱动、系统级错误的记录。如果这里有 OOM Killer(内存不足杀进程)或磁盘 I/O 错误的记录,问题根源就找到了。