在迁移 VPS、排查服务器不稳定、评估主机质量时,仅凭“感觉卡”是远远不够的。真正有价值的,是一份能够在某个时间点完整记录服务器运行状态的“体检报告”。
本文介绍并解析一个实用的 Bash 脚本 —— vps_healthcheck.sh,它的作用是:
在几秒钟内抓取 VPS 的 CPU、内存、磁盘、IO、网络、内核状态,并保存为可追溯的日志文件。
这类脚本广泛用于运维取证、迁移前后对比、主机质量评估等场景。
一、完整脚本(脱敏版)
#!/usr/bin/env bash
set -euo pipefail
# 使用 ISO8601 时间作为日志名,避免覆盖
ts="$(date -Is | tr ':' '-')"
out="/root/vps-health-${ts}.log"
# 所有输出同时显示在屏幕并写入日志
exec > >(tee -a "$out") 2>&1
echo "===== BASIC ====="
date -Is
uname -a
uptime
echo
echo "===== CPU ====="
command -v lscpu >/dev/null && \
lscpu | egrep -i 'Model name|CPU\(s\)|Thread|MHz|Hypervisor|Virtualization' || true
echo
echo "===== MEMORY ====="
free -h
cat /proc/meminfo | egrep 'MemTotal|MemFree|MemAvailable|Cached|Buffers|Slab|SwapTotal|SwapFree' || true
echo
echo "===== TOP RSS ====="
ps aux --sort=-rss | head -n 20
echo
echo "===== LOAD / VMSTAT (1s x 5) ====="
vmstat 1 5
echo
echo "===== DISK ====="
df -hT
lsblk -f || true
echo
echo "===== DISK IO (if iostat exists) ====="
if command -v iostat >/dev/null; then
iostat -xz 1 5
else
echo "iostat not found (install package 'sysstat' if needed)."
fi
echo
echo "===== NETWORK ====="
ip -s link
ss -s || true
echo
echo "===== KERNEL WARN (OOM / IO / HANG) ====="
dmesg -T | egrep -i 'oom|killed process|ext4|xfs|nvme|blk|i/o error|reset|hung task' | tail -n 200 || true
echo
echo "Saved to: $out"
二、脚本的核心定位
该脚本并不尝试修复系统,也不对服务器进行任何修改。
它的唯一目标是:
在某一时刻,对 VPS 进行一次完整、可留存的健康快照。
这份快照可以用于:
- 判断 VPS 是否被超售
- 诊断是否存在内存耗尽(OOM)
- 分析磁盘 IO 是否异常
- 查看是否存在大量异常网络连接
- 在迁移前后对比主机质量
三、为什么这个日志设计很专业
脚本使用:
exec > >(tee -a "$out") 2>&1
意味着:
所有输出 → 屏幕 + 文件 同步写入
这样可以:
- 立即查看
- 长期保存
- 作为迁移前后的对比证据
- 作为向 VPS 服务商反馈问题的技术材料
这是标准运维“取证型日志”设计方式。
四、采集了哪些关键指标
1. CPU 与虚拟化环境
通过 lscpu 可判断:
- 实际 CPU 型号
- 分配给 VPS 的核数
- 是否运行在虚拟机中
- 是否被 KVM / Hypervisor 管理
用于识别 VPS 是否存在严重超售。
2. 内存与 OOM 风险
free -h + /proc/meminfo 可以看到:
- 实际可用内存
- cache / slab 占用
- swap 是否在狂用
这是判断系统是否会因内存压力杀进程的核心依据。
3. 谁在吃内存
ps aux --sort=-rss 会列出:
当前最耗内存的 20 个进程
用来快速定位异常服务或失控容器。
4. 系统是否被卡住
vmstat 1 5 可看:
- IO wait
- CPU 抢占
- swap 抖动
- 运行队列长度
可判断 VPS 是否处于“假死”状态。
5. 磁盘是否是瓶颈
iostat -xz 显示:
- await(IO 延迟)
- util(磁盘是否被打满)
- 队列堆积
这是判断 VPS 磁盘是否劣质的关键数据。
6. 网络是否异常
ip -s link + ss -s 可以看到:
- 收发包量
- 错包
- 当前连接数
可以识别扫描、攻击、爬虫或连接泄漏。
7. 内核是否偷偷杀进程
dmesg 过滤:
- OOM killer
- I/O error
- hung task
这是解释“服务突然消失”“SSH 掉线”的最重要证据。
五、这个脚本在真实运维中的价值
这个脚本可以把模糊的“VPS 不稳定”转化为:
CPU、内存、IO、网络、内核行为的可量化快照
它特别适合用于:
- VPS 迁移前后的质量对比
- 判断服务商是否提供了劣质主机
- 排查间歇性卡顿和进程消失
结语
vps_healthcheck.sh 不是花哨的工具,而是一个运维级取证脚本。
它的意义只有一个:
在关键时刻留下数据,而不是留下猜测。
在任何严肃的服务器运维或迁移过程中,这样的一份“健康快照”,往往比所有主观判断都更有价值。