服务器常见故障排查指南:5分钟定位问题的分层诊断法
结论先行:服务器故障排查的核心是「分层诊断、由外到内」,严禁一上来就盲目重启或死磕日志。排查铁律:先查网络连通(ping / nc),再看系统资源(htop / free / df / iostat),接着确认服务进程与端口(ss / systemctl),最后按优先级过滤错误日志(journalctl -p err)。熟练运用分层模型配合自动化健康检测脚本,90% 的线上疑难杂症均能在 5 分钟内锁定根本原因。
1、你能搞定啥
- 掌握网络、资源、进程、日志的四层故障诊断模型
- 熟练运用
htop、iostat、ss、journalctl等运维高频命令 - 遇到 CPU 爆满、内存泄漏 OOM、磁盘被日志占满等典型故障时,5 分钟内定位源头
- 借助
ittinker-scripts开源自检工具自动化定位境外网络连通性与机器健康状态
2、排查核心思路:四层诊断模型
遇到服务器异常时,最忌讳凭感觉到处乱试或直接重启机器。直接重启会瞬间抹掉内存状态、临时文件句柄与网络连接现场,导致偶发性 Bug 彻底失去复盘线索。
排查必须遵循「由外到内、逐层递进」的医学诊断式思维:
3、第一层:网络连通性与可达性诊断
服务器毫无响应时,首先判断是链路阻断、云商拦截还是机器死机。
基础网络测试
1 | # 1. ICMP 连通性测试(发送 4 个包) |
SSH 握手卡点的快速判断
| 握手卡住阶段 | 常见根本原因 | 应对方案 |
|---|---|---|
Could not resolve hostname |
本地或公共 DNS 解析失败 | 更换为 1.1.1.1 或 8.8.8.8 |
Connecting to ... port 22 后挂起超时 |
防火墙未放行该端口或 IP 被阻断 | 检查云商安全组与本地网络 |
Connection refused |
目标端口无进程监听或被防火墙 DROP | 登录 VNC 检查 sshd 是否存活 |
Permission denied (publickey) |
私钥权限错误(需 600)或公钥未写入 authorized_keys |
核对私钥路径与目标机文件属组 |
出海场景神器:vps-gfw-diagnose
出海开发者的海外 VPS 经常遭遇“本地打不开,海外节点秒开”的情况。
推荐直接运行我们在开源脚本库 ittinker-scripts 中提供的连通性多维诊断工具:
1 | # 进入脚本目录直接执行探测 |
该工具会并发拉起本地、国内节点与海外探针的 ICMP/TCP 综合比对,输出权威结论:
- 本地超时 + 国内超时 + 海外全通:IP 或特定端口遭遇 GFW 干扰阻断。可通过提交工单换 IP 或套 Cloudflare Tunnel 穿透解决。
- 本地与海外皆超时:机房宕机、安全组全阻断或系统彻底死锁,需前往云平台管理后台开启 VNC 控制台排查。
4、第二层:系统资源瓶颈速查
网络能够登录后,第二步立即查看 CPU、内存、磁盘与 I/O 四大核心指标。
决策路径树
1. 系统负载与 CPU
1 | # 查看平均负载(1分钟、5分钟、15分钟) |
- 负载评估法则:如果 1 核心 VPS 的 load average 达到 2.5,代表大量计算任务在就绪队列中排队。
- 打开
htop:- 按
F5切换树状图查看父子进程层级。 - 按
F6按 CPU 使用率降序排列。 - 按
F9发送SIGTERM(优雅终止)或SIGKILL(强制终止)。
- 按
2. 内存与 Swap 交换区
1 | free -h |
输出重点关注项:
available:系统当前真正可以立刻分配给新进程的物理内存。当 available 占总内存比例低于 10% 时,系统处于危险边缘。Swap used:Swap 被频繁读写(si/so 大于 0)意味着物理内存不足,系统正将内存页频繁刷入慢速磁盘,吞吐量将出现断崖式下跌。
按内存占用排序查出前 10 个进程:
1 | ps aux --sort=-%mem | head -n 11 |
3. 磁盘空间与 Inode 耗尽
1 | # 检查磁盘容量占用 |
[!WARNING]
很多时候磁盘容量显示还有几十 GB 空余,但新建文件依然报错No space left on device。这是因为小日志或会话文件数量过多把 Inode 吃光了(df -i显示 100%)。
快速定位最大目录与清理大文件:
1 | # 定位根目录下最大的前 10 个目录 |
4. 磁盘 I/O 堵塞排查
很多时候 CPU 使用率只有 10%,但整机卡顿无比,通常由 I/O 瓶颈引起。
1 | # 每 2 秒刷新一次磁盘性能统计 |
关注核心字段:
%iowait:CPU 等待 I/O 操作完成的时间百分比。持续超过 10% 表明磁盘吞吐严重跟不上处理速度。%util:磁盘处理请求的繁忙百分比,接近 100% 说明磁盘已打满。
使用 iotop 抓出频繁读写的罪魁祸首:
1 | sudo iotop -oP |
5、第三层:应用与端口状态探查
资源指标均正常,但客户端返回 502 或无法访问,进入服务监听层排查。
端口与 Socket 侦听
使用现代 ss 命令替代陈旧的 netstat:
1 | # 查看所有正在侦听的 TCP/UDP 端口及对应进程 PID |
如果关键端口未处于 LISTEN 状态,说明主进程崩溃或配置加载失败。
systemd 服务状态与管理
1 | # 检查服务运行状态 |
6、第四层:日志检索与精准过滤
日志是还原真相的终极现场。
1. systemd 集中化日志分析(journalctl)
1 | # 实时跟踪最近的系统报错信息 |
2. 内核事件探查(dmesg)
当发生 Out of Memory(内存溢出)时,Linux 内核会启动 OOM Killer 杀掉高消耗进程。此类致命事件通常不会记录在应用日志中,而记录在内核环形缓冲区中:
1 | # 检索内核中是否发生 OOM 强杀事件 |
7、日常防护:开源工具自动化巡检
与其在夜间故障时手忙脚乱,不如在日常部署一套极简巡检告警探针。
在 ittinker-scripts 中,我们维护了专为单机 VPS 设计的零依赖监控工具 vps-health-monitor。
引入 vps-health-monitor
该工具使用纯原生 Bash 编写,不需要在宿主机常驻体积庞大的 Prometheus 节点,通过 crontab 周期性巡检,内存占用近乎为零:
1 | # 下载并进入监控脚本目录 |
接入 Cron 自动化告警(每 10 分钟轮询一次)
1 | # 当 CPU 使用率 > 85%、内存 > 90% 或磁盘空间 > 90% 时,主动推送告警卡片 |
8、实战排查全流程 Checklist
在遇到线上故障时,按照以下执行清单逐步排查:
- [ ] 网络连通:
ping -c 4 <IP>确认网络畅通;若国内不通海外通,使用vps-gfw-diagnose判定阻断情况 - [ ] 系统负载:
uptime检查 load average 与核心数比值 - [ ] CPU 占用:
htop查看高消耗进程,按F5确定父进程归属 - [ ] 内存状态:
free -h检查available余量,dmesg -T | grep -i oom确认是否曾触发内核强杀 - [ ] 磁盘与文件:
df -h与df -i检查根分区空间与 Inode - [ ] 磁盘 I/O:
iostat -x 2查看%iowait是否超过 10% - [ ] 服务侦听:
ss -tulpn验证对应服务是否正确侦听在指定公网/内网端口 - [ ] 错误日志定位:
journalctl -p err -b配合tail -n 50 /var/log/nginx/error.log查看第一案发现场 - [ ] 日常巡检:故障解决后,配置
vps-health-monitor固化阈值告警


