结论先行:服务器故障排查的核心是「分层诊断、由外到内」,严禁一上来就盲目重启或死磕日志。排查铁律:先查网络连通(ping / nc),再看系统资源(htop / free / df / iostat),接着确认服务进程与端口(ss / systemctl),最后按优先级过滤错误日志(journalctl -p err)。熟练运用分层模型配合自动化健康检测脚本,90% 的线上疑难杂症均能在 5 分钟内锁定根本原因。

全景图解导览:服务器常见故障排查指南:5分钟定位问题的分层诊断法 STAGE 01 · 问题起爆 你能搞定啥 • 环节01:掌握网络、资源、 进程、日志的四层故障诊断… • 环节02:熟练运用htop… 定位核心风险卡点 STAGE 02 · 机制拆解 排查核心思路:四层诊断… • 拆解核心协议与准则 • 识别关键决策分水岭 • 识别关键决策分水岭 理清底层因果逻辑 STAGE 03 · 方案对照 第一层:网络连通性与可… • 本地超时+国内超时+海外全 通:IP或特定端口遭遇GFW… • 本地与海外皆超时:机房宕… 对齐量化实测标尺 STAGE 04 · 工程落地 第二层:系统资源瓶颈速… • 负载评估法则:如果1核心 VPS的load average达到… • 决策路径树:决策路径树 锁死生产确定性

1、你能搞定啥

  • 掌握网络、资源、进程、日志的四层故障诊断模型
  • 熟练运用 htop、iostat、ss、journalctl 等运维高频命令
  • 遇到 CPU 爆满、内存泄漏 OOM、磁盘被日志占满等典型故障时,5 分钟内定位源头
  • 借助 ittinker-scripts 开源自检工具自动化定位境外网络连通性与机器健康状态
问题现场解剖:你能搞定啥 ⚠️ 从问题出发:表面症状是如何一步步演变为生产故障或降权的? 独立开发者工具箱 · CH-51 · 核心卡点传导链 1. 环节01 掌握网络、资源、进程、日志的 四层故障诊断模型 症结:认知偏差与配置盲区 2. 环节02 熟练运用htop、iostat、ss、 journalctl等运维高频命令 传导:隐性劣化与边界失守 3. 环节03 遇到CPU爆满、内存泄漏OOM、 磁盘被日志占满等典型故障时… 破局:量化指标与工程验证 ✅ 破局核心原则(结论先行) 服务器故障排查的核心是「分层诊断、由外到内」,严禁一上来就盲目重启或死磕 日志。排查铁律:先查网络连通(ping/nc),再看系统资源(htop/free/df…

2、排查核心思路:四层诊断模型

遇到服务器异常时,最忌讳凭感觉到处乱试或直接重启机器。直接重启会瞬间抹掉内存状态、临时文件句柄与网络连接现场,导致偶发性 Bug 彻底失去复盘线索。

排查必须遵循「由外到内、逐层递进」的医学诊断式思维:

服务器故障排查分层思路 1. 网络连通层 ICMP ping 通畅? SSH 端口可达? 国内/海外丢包? 2. 系统资源层 CPU 跑满 100%? 可用内存不足? 磁盘空间/Inode 满? 磁盘 I/O 堵塞? 3. 进程服务层 进程处于 Running? 端口是否监听? 僵尸进程堆积? 4. 日志分析层 journalctl 错误 dmesg 内核 OOM 应用专项报错 自外向内逐层验证,哪层出现断点就在哪层深入

3、第一层:网络连通性与可达性诊断

服务器毫无响应时,首先判断是链路阻断、云商拦截还是机器死机。

基础网络测试

1
2
3
4
5
6
7
8
9
# 1. ICMP 连通性测试(发送 4 个包)
ping -c 4 你的服务器IP

# 2. TCP 端口探测(测试 SSH 端口或 Web 端口)
nc -zv -w 3 你的服务器IP 22
nc -zv -w 3 你的服务器IP 443

# 3. SSH 详细调试模式连接(输出详细握手流程)
ssh -vvv -p 22 用户名@你的服务器IP

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
2
3
# 进入脚本目录直接执行探测
cd ittinker-scripts/vps-gfw-diagnose
bash diagnose.sh 你的VPS公网IP -p 22

该工具会并发拉起本地、国内节点与海外探针的 ICMP/TCP 综合比对,输出权威结论:

  • 本地超时 + 国内超时 + 海外全通:IP 或特定端口遭遇 GFW 干扰阻断。可通过提交工单换 IP 或套 Cloudflare Tunnel 穿透解决。
  • 本地与海外皆超时:机房宕机、安全组全阻断或系统彻底死锁,需前往云平台管理后台开启 VNC 控制台排查。
多维实测与判断标尺矩阵:第一层:网络连通性与可达性诊断 握手卡住阶段 常见根本原因 应对方案 Could not resolve… 本地或公共DNS解析失败 更换为1.1.1.1或8.8.8.8 Connecting to...… 防火墙未放行该端口或IP被阻断 检查云商安全组与本地网络 Connection refused 目标端口无进程监听或被防火墙DROP 登录VNC检查sshd是否存活 Permission denied… 私钥权限错误(需600)或公钥未写… 核对私钥路径与目标机文件属组

4、第二层:系统资源瓶颈速查

网络能够登录后,第二步立即查看 CPU、内存、磁盘与 I/O 四大核心指标。

决策路径树

1. 系统负载与 CPU

1
2
3
4
5
# 查看平均负载(1分钟、5分钟、15分钟)
uptime

# 查看逻辑核心数
nproc
  • 负载评估法则:如果 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
2
3
4
5
# 检查磁盘容量占用
df -h

# 检查文件节点(Inode)使用率
df -i

[!WARNING]
很多时候磁盘容量显示还有几十 GB 空余,但新建文件依然报错 No space left on device。这是因为小日志或会话文件数量过多把 Inode 吃光了(df -i 显示 100%)。

快速定位最大目录与清理大文件:

1
2
3
4
5
6
7
8
# 定位根目录下最大的前 10 个目录
du -sh /* 2>/dev/null | sort -hr | head -n 10

# 生产环境常见空间吞噬者:
# 1. /var/log/ 堆积的巨大旧日志
# 2. /var/lib/docker/ 容器与镜像废弃层
docker system df
docker system prune -af --volumes

4. 磁盘 I/O 堵塞排查

很多时候 CPU 使用率只有 10%,但整机卡顿无比,通常由 I/O 瓶颈引起。

1
2
# 每 2 秒刷新一次磁盘性能统计
iostat -x 2

关注核心字段:

  • %iowait:CPU 等待 I/O 操作完成的时间百分比。持续超过 10% 表明磁盘吞吐严重跟不上处理速度。
  • %util:磁盘处理请求的繁忙百分比,接近 100% 说明磁盘已打满。

使用 iotop 抓出频繁读写的罪魁祸首:

1
sudo iotop -oP
底层机制与架构拆解:第二层:系统资源瓶颈速查 四阶段递进分析模型 · 从前置识别到最终工程定级 S1 负载评估法则 如果1核心VPS的load average达到2.5,代表… S2 决策路径树 决策路径树 底层规则强约束 S3 系统负载与CPU bash 底层规则强约束 S4 内存与Swap交换区 bash 底层规则强约束 💡 工程启示:任何一个前置环节失守,都会通过传导链放大为下游的系统性偏差

5、第三层:应用与端口状态探查

资源指标均正常,但客户端返回 502 或无法访问,进入服务监听层排查。

端口与 Socket 侦听

使用现代 ss 命令替代陈旧的 netstat:

1
2
3
4
5
6
7
8
# 查看所有正在侦听的 TCP/UDP 端口及对应进程 PID
ss -tulpn

# 筛选指定端口(如 80 或 443)
ss -tulpn | grep -E ':80|:443'

# 统计当前连接状态分布
ss -tan | awk '{print $1}' | sort | uniq -c

如果关键端口未处于 LISTEN 状态,说明主进程崩溃或配置加载失败。

systemd 服务状态与管理

1
2
3
4
5
6
7
8
9
# 检查服务运行状态
sudo systemctl status nginx
sudo systemctl status docker

# 测试配置文件合法性(避免因配置写错导致服务启动失败)
sudo nginx -t

# 重新加载服务
sudo systemctl restart nginx
问题现场解剖:第三层:应用与端口状态探查 ⚠️ 从问题出发:表面症状是如何一步步演变为生产故障或降权的? 独立开发者工具箱 · CH-51 · 核心卡点传导链 1. 端口与Socket侦听 使用现代ss命令替代陈旧的 netstat: 症结:认知偏差与配置盲区 2. systemd服务状态与管理 bash 需通过真实环境实测核验 传导:隐性劣化与边界失守 3. 缺乏验证流程 无量化观测指标与自动化止损防 线 破局:量化指标与工程验证 ✅ 破局核心原则(结论先行) 服务器故障排查的核心是「分层诊断、由外到内」,严禁一上来就盲目重启或死磕 日志。排查铁律:先查网络连通(ping/nc),再看系统资源(htop/free/df…

6、第四层:日志检索与精准过滤

日志是还原真相的终极现场。

1. systemd 集中化日志分析(journalctl)

1
2
3
4
5
6
7
8
9
10
11
# 实时跟踪最近的系统报错信息
journalctl -xe -f

# 仅抓取指定服务(如 nginx)的日志
journalctl -u nginx -n 100 --no-pager

# 按日志级别过滤(抓取 error 及以上严重级别的事件)
journalctl -p err -b

# 过滤最近 30 分钟内的所有异常
journalctl --since "30 minutes ago" -p err

2. 内核事件探查(dmesg)

当发生 Out of Memory(内存溢出)时,Linux 内核会启动 OOM Killer 杀掉高消耗进程。此类致命事件通常不会记录在应用日志中,而记录在内核环形缓冲区中:

1
2
3
4
5
# 检索内核中是否发生 OOM 强杀事件
dmesg -T | grep -i oom

# 检索硬件与驱动级报错
dmesg -l err
底层机制与架构拆解:第四层:日志检索与精准过滤 四阶段递进分析模型 · 从前置识别到最终工程定级 S1 systemd集中化日志分… bash 底层规则强约束 S2 内核事件探查(… 当发生Out of Memory( 内存溢出)时,Linux内… S3 瓶颈隔离与风险阻断 剔除干扰链路、单点隐患 与高危配置 S4 确定性架构标准输出 沉淀为可一键复现的工程 配置基线 💡 工程启示:任何一个前置环节失守,都会通过传导链放大为下游的系统性偏差

7、日常防护:开源工具自动化巡检

与其在夜间故障时手忙脚乱,不如在日常部署一套极简巡检告警探针。

在 ittinker-scripts 中,我们维护了专为单机 VPS 设计的零依赖监控工具 vps-health-monitor。

引入 vps-health-monitor

该工具使用纯原生 Bash 编写,不需要在宿主机常驻体积庞大的 Prometheus 节点,通过 crontab 周期性巡检,内存占用近乎为零:

1
2
3
4
5
6
# 下载并进入监控脚本目录
cd ittinker-scripts/vps-health-monitor

# 配置通知凭证并测试运行
export FEISHU_WEBHOOK_URL="https://open.feishu.cn/open-apis/bot/v2/hook/xxxx"
bash monitor.sh

接入 Cron 自动化告警(每 10 分钟轮询一次)

1
2
# 当 CPU 使用率 > 85%、内存 > 90% 或磁盘空间 > 90% 时,主动推送告警卡片
(crontab -l 2>/dev/null; echo "*/10 * * * * FEISHU_WEBHOOK_URL=\"https://open.feishu.cn/...\" /root/ittinker-scripts/vps-health-monitor/monitor.sh > /dev/null 2>&1") | crontab -
问题整改前后解剖:日常防护:开源工具自动化巡检 ⚠️ 整改前:常见踩坑与失分现场 • 盲区 1:忽视「引入…」边界约束 • 盲区 2:缺乏「接入Cron自动化告警(每…」实测核验 • 盲区 3:遗漏「可验证证据链」兜底监控 后果:线上隐性故障频发 / 评估等级下调 ✅ 整改后:高确定性工程实践 • 动作 1:引入vps-health-monitor:该工具使用纯原… • 动作 2:接入Cron自动化告警(每10分钟轮询一次)… • 动作 3:可验证证据链:配备实机压测指标、日志与可复… 收益:指标可观测、配置可复现、风险可阻断

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 固化阈值告警
落地执行与验证流水线:实战排查全流程Checklist 按序执行以下四步流程,把定性经验转化为可自动巡检的工程防线 STEP 01 网络连通 ping-c 4<IP确认网络畅 通;若国内不通海外通… STEP 02 系统负载 uptime检查load average与核心数比值 STEP 03 CPU占用 htop查看高消耗进程,按 F5确定父进程归属 STEP 04 内存状态 free-h检查available余 量,dmesg-T|grep-i…