你是否遇到过这样的情况?
明明购买的是 8GB 内存的云服务器,程序却频繁被系统 KILL,日志里清清楚楚写着 Out of memory。可当你查看系统资源监控时,却发现“可用内存还有好几 GB”——这到底是怎么回事?

答案很可能令人失望:你买到的是一台被严重“超卖”(Overcommitted)的虚拟机。

什么是服务器“超卖”?

很多小型云服务商为了最大化利润,会对物理服务器进行资源超开(也称超卖)。举个例子:

  • 一台物理服务器拥有 64GB 内存 + 64 核 CPU
  • 如果按 8GB 内存 + 8 核 CPU 的配置售卖,理论上只能划分出 8 台独立的云主机。
  • 但现实中,用户并不会 24 小时满载运行。于是,一些无良商家会继续超售,比如再卖出 8 台,变成总共 16 台虚拟机,多超开一倍已经是很理想的情况了,现实情况超卖问题只会更为严重。

在这种情况下:

  • 你的控制面板依然显示“8GB 内存”,看似配置没变;
  • 但实际上,物理资源已被多个用户共享
  • 一旦其他租户跑高负载任务(如大数据处理、AI训练等),整个宿主机资源就会紧张;
  • 此时即使你的系统显示“还有 5GB 空闲内存”,真实可用物理内存可能不足 2GB
  • 最终结果:你的进程因无法分配内存而被 Linux OOM Killer 强制终止。

💡 超卖的本质:用“纸面配置”掩盖“实际资源不足”,牺牲稳定性换取更高利润。

超卖带来的三大风险

  1. 性能不可靠:无法保证峰值性能,突发任务极易失败;
  2. 系统不稳定:频繁被 kill、服务中断、响应延迟;
  3. 数据安全隐患:极端情况下可能导致 I/O 阻塞甚至数据损坏。

如何验证服务器是否被超卖?用 stress-ng 测试真实内存!

好消息是,我们可以通过一个简单工具——stress-ng,来探测服务器真实的可用内存上限。

什么是 stress-ng?

stress-ng 是一个功能强大的压力测试工具,支持对 CPU、内存、I/O、虚拟内存等系统资源施加可控负载。我们将用它来逐步吃满内存,观察系统在何时开始出现异常(如进程被 kill、系统卡死等),从而判断物理内存的真实容量

测试步骤简述

  1. 安装 stress-ng(多数 Linux 发行版可通过包管理器安装);
  2. 逐步增加内存压力(例如每次增加 1GB);
  3. 监控系统日志(dmesg 或 /var/log/messages)是否出现 OOM 记录;
  4. 当进程首次被强制终止时,所使用的内存值 ≈ 真实可用物理内存上限

✅ 提示:此方法虽不能 100% 精确,但足以暴露严重超卖问题。

本篇文章将教会你,如何使用stress-ng工具来测试服务器的真实可用内存大小。

在常用 Linux 发行版中安装 stress-ng

stress-ng 已被收录进大多数主流发行版的官方仓库,安装非常简单。

✅ Ubuntu / Debian 系列

sudo apt update
sudo apt install -y stress-ng

✅ CentOS / Rocky Linux / AlmaLinux(RHEL 系列)

注意:CentOS 7 默认仓库可能没有 stress-ng,建议启用 EPEL 源。

# CentOS 7
sudo yum install -y epel-release
sudo yum install -y stress-ng

# CentOS 8 / Rocky / AlmaLinux 8+
sudo dnf install -y epel-release
sudo dnf install -y stress-ng

✅ Fedora

sudo dnf install -y stress-ng

✅ Arch Linux / Manjaro

sudo pacman -S stress-ng

安装完成后,验证版本:

stress-ng --version

如果输出类似 stress-ng version 0.14.01,说明安装成功!

stress-ng 基础用法:内存压力测试

stress-ng 支持多种压力类型,但我们重点关注 内存(vm)测试

🔧 基本语法

stress-ng --vm <进程数> --vm-bytes <每进程分配内存> --timeout <持续时间>
  • --vm:启动 N 个虚拟内存压力进程;
  • --vm-bytes:每个进程尝试分配的内存量(支持 K/M/G 单位);
  • --timeout:测试持续时间,避免无限运行;
  • --verbose:显示详细日志(可选)。

🧪 示例 1:测试 4GB 内存是否真实可用

stress-ng --vm 1 --vm-bytes 4G --timeout 60s --verbose

这条命令会:

  • 启动 1 个进程;
  • 尝试分配 4GB 连续虚拟内存并频繁读写(模拟真实负载);
  • 持续 60 秒后自动退出。

⚠️ 重要提示
--vm-bytes 分配的是可交换的虚拟内存,但 stress-ng 默认会通过 mlock() 锁定内存(防止 swap),从而真正消耗物理 RAM。这是检测超卖的关键!

如果你看到如下输出,说明内存分配成功:

stress-ng: info:  [12345] dispatching hogs: 1 vm
stress-ng: info:  [12345] successful run completed in 60.01s

但如果系统内存不足,你可能会遇到:

  • 进程被突然终止;
  • 终端无响应;
  • 或出现 Killed 字样。

这时候就要查看系统日志了!


📋 示例 2:逐步逼近真实内存上限(推荐做法)

不要一次性测试 8G!建议从小到大逐步测试,比如:

# 测试 2G
stress-ng --vm 1 --vm-bytes 2G --timeout 30s

# 测试 3G
stress-ng --vm 1 --vm-bytes 3G --timeout 30s

# 测试 4G
stress-ng --vm 1 --vm-bytes 4G --timeout 30s

# 以此类推...

每次成功后再增加 1G,直到某次命令返回 Killed 或卡死。此时的前一个成功值,就是你的真实可用物理内存上限

如何判断是否被“内存超卖”?

测试后,请结合以下信息综合判断:

表格

现象可能原因
购买 8G,但 3G 就被 kill极可能被严重超卖
free -h 显示空闲多,但程序仍 OOM物理内存已耗尽,虚拟内存无法兑现
dmesg 出现 Out of memory: Kill process系统因物理内存不足触发 OOM Killer

🔍 查看 OOM 日志

运行完测试后,立即执行:

dmesg | grep -i "killed process"

journalctl -k | grep -i "oom\|kill"

如果看到类似:

[12345.678901] Out of memory: Killed process 9876 (stress-ng) ...

说明系统真的没内存了,而非你的程序有 bug。

常见报错与解决方案

❌ 报错 1:command not found: stress-ng

原因:未安装或安装失败。
解决

  • 确认是否启用了 EPEL(RHEL/CentOS);
  • 尝试 sudo apt install stress-ng(Debian/Ubuntu);
  • 或从源码编译(不推荐新手)。

❌ 报错 2:Cannot allocate memory(即使 free 显示有空闲)

原因:这是典型的超卖表现!系统显示的“可用内存”包含共享/超额分配的部分,但物理 RAM 已满。
验证方法

  • 同时运行 htop 或 free -h 观察;
  • 查看 dmesg 是否有 OOM 记录;
  • 尝试降低 --vm-bytes 值重试。

❌ 报错 3:系统卡死 / SSH 断连

原因:内存耗尽导致系统无响应。
预防措施

  • 务必加 --timeout 参数,避免无限运行;
  • 不要一次性分配接近标称内存的值(如标 8G 就测 8G);
  • 建议在非生产环境或快照后测试;
  • 可配合 screen 或 tmux 运行,防止断连丢失日志。

❌ 报错 4:stress-ng: error: unrecognized option '--vm-bytes'

原因:你可能装的是老版 stress(不是 stress-ng)!
区别

  • stress:基础工具,功能有限;
  • stress-ng:增强版,支持 --vm-bytes--vm-keep 等高级选项。

解决
卸载 stress,确保安装的是 stress-ng

CentOS 7 (使用 yum

sudo yum remove stress-ng

CentOS 8 / Rocky Linux / AlmaLinux(使用 dnf):

sudo dnf remove stress-ng

💡 提示:dnf 在 CentOS 8+ 中是 yum 的继任者,两者命令基本兼容,但推荐使用对应系统的默认包管理器。

Ubuntu/Debian

sudo apt remove stress
sudo apt install stress-ng

结语:别被“纸面参数”迷惑

在云计算时代,配置 ≠ 实际性能。尤其在低价 VPS 市场,超卖现象极为普遍。作为开发者或运维人员,主动验证资源真实性,是保障服务稳定的第一步。