Appearance
综合实验:排查一台“卡住”的服务器
这一讲不教新命令,只练一件事:面对一台“变慢了”的服务器,按稳定顺序定位问题。
先记住一句话:排查不是猜,是排除;每跑一条命令都要缩小一次范围。
一、固定排查漏斗
text
① 资源:CPU / 内存 / 磁盘是否打满
② 进程:谁占用了资源,是否异常重启
③ 端口:服务是否在监听,是否被别的进程占用
④ 网络:本机请求、DNS、外网请求是否通
⑤ 日志:服务日志和系统日志里有没有错误时间线
⑥ 配置:环境变量、权限、路径是否被改动二、资源层
bash
uptime
free -h
df -h
du -sh /var/log/* 2>/dev/null | sort -h | tail判断:load average 是否超过 CPU 核数,内存是否耗尽,磁盘是否 100%。
三、进程层
bash
ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10
top -b -n 1 | head -20如果发现异常进程,先确认它是什么,再决定 kill -15。
四、端口与服务层
bash
ss -lntp
systemctl --failed
systemctl status nginx
journalctl -u nginx -n 50 --no-pager常见结论:
- 端口没监听:服务没起来 / 崩了 / 配置错误
- 端口被别的进程占用:
ss -lntp找到 PID,再决定停谁 - 服务反复重启:看
journalctl -u的第一条错误
五、网络层
bash
curl -v http://127.0.0.1:PORT/
curl -v https://目标域名/
dig +short 目标域名
ping -c 3 目标域名依次排除:本机服务、DNS、出口网络、目标服务。
六、动手实验
💡 动手实验:故意制造三种故障,再用上面的漏斗定位。
bash
# 故障 1:端口被占用
cd /tmp
python3 -m http.server 18081 >/tmp/a.log 2>&1 &
python3 -m http.server 18081 >/tmp/b.log 2>&1 || true
ss -lntp | grep 18081
# 记录:哪个 PID 占用了端口?第二个进程报了什么错?
# 故障 2:CPU 占满
timeout 60 bash -c 'while true; do :; done' &
ps aux --sort=-%cpu | head -5
# 记录:占用最高的 PID 和 COMMAND 是什么?
# 故障 3:日志里的高频错误
cat > /tmp/app.log <<'LOG'
2026-09-14 10:00:01 ERROR db timeout
2026-09-14 10:00:02 INFO ok
2026-09-14 10:00:03 ERROR db timeout
2026-09-14 10:00:04 ERROR db timeout
LOG
grep "ERROR" /tmp/app.log | wc -l
awk '/ERROR/ {print $NF}' /tmp/app.log | sort | uniq -c七、排查记录模板
每次排障都按这个模板写,三句话即可:
text
现象:
已排除:
下一步:小结
- 排查顺序:资源 → 进程 → 端口 → 网络 → 日志 → 配置
- 每个结论都必须有命令输出支撑,不能凭感觉
- 每次故障后写三行记录,下次同类问题直接复用
🧠 记忆锚点:先看资源再抓进程,端口不对查监听,网络不通看 DNS,最后一定翻日志。