·约 10 分钟阅读·DeepSeek

便宜的 VPS 到底需要多少内存?—— 用真实机器实测

便宜的 VPS 不需要多大——这个博客就跑在 1 vCPU、981 MB 内存上。用这台机器的真实实测数据(dd、openssl、构建时的负载),讲清到底哪些标准才真正决定一个小型自托管栈能不能稳住。

self-hostingdevops

我把这个博客跑在一台便宜的 VPS 上。不是迷人的家庭实验室,不是租来的机柜—— 就是外国数据中心里的一台小虚拟机,那种一个月一杯咖啡钱就能拿到的机器。它用 nginx 提供静态站点、终结一个网格 VPN,还时不时地从源码把整个站点编译一遍。而 这一切,它用的资源少到一部手机都会笑话它。

一般性的选购清单我已经写在 choosing a VPS 里, self-hosting without Docker 也写了。这一 篇是它的姊妹篇:不谈选哪台,而是谈你能省到什么程度,并且用我正在敲键盘 的这台机器的真实数字来证明。因为人们真正问的问题不是「标准是什么」,而是 「我需要多少内存」——而答案几乎总是比套餐页面暗示的要少。

一个小型自托管栈到底需要什么

谈标准之前,先算笔账。一个小型栈就是一串进程,每一个的内存占用你都可以实测, 而不是靠猜:

  • nginx 提供静态文件:常驻约 20 MB。它是文件缓存和 TLS 终结器,并不怎么动 脑子。
  • 静态站点编译(就是产出这篇博客的 Astro 构建):一个 Node 进程,峰值冲到 约 400–500 MB,然后退出。这是这台机器做的最重的事,而且是临时的。
  • 密码保险库(Vaultwarden):约 80 MB,待得很开心。
  • 网格 VPN 端点(EasyTier/WireGuard):约 20 MB,加一条内核隧道。
  • 操作系统本身:journald、sshd、一个 cron、systemd——正常安装大约 200 MB。

加起来,一个诚实的小型栈活在大约 700–900 MB 里,构建的峰值是唯一会碰到天花 板的数字。这才是要对标的大小。对于这个 workload,1 GB 内存的机器不是笑话——它 就是正确答案,前提是你给它一点 swap 来应付构建峰值,并且你不顺便再跑一个数据 库。

# 这台机器空闲时实际跑的进程,按常驻内存(RSS)排序:
ps -eo comm,rss --sort=-rss | head -8
   COMMAND          RSS
   node          428368   # Astro 构建中(就是那个峰值)
   npm            58656
   systemd-journald 25248
   vaultwarden     8328
   sshd            6112
   systemd          5900
   cron            2688
   sshd            2400

把这读作一份预算,而不是快照:构建是离群值,稳态远低于 500 MB,而这一切都能塞 进 1 GB,还留得出页面缓存的空间。页面缓存是关键——你没用的内存,内核会用它把读 取变成瞬时命中,所以「空闲」内存并不是浪费的内存。

栈需要的内存(稳态 + 构建峰值) 约 900 MB 这台机器的内存 981 MB vCPU(1 个共享核心就够了) 1 磁盘(静态站点 14 GB 绰绰有余) 14 GB
图 1 —— 一个小型自托管栈是内存问题,不是 CPU 或磁盘问题。实条是能装下的量,虚线框是这台机器。

标准,按真正重要的顺序排

1. 永远先内存后 vCPU

对一个小栈来说,你先耗尽的是内存,而最不常被你察觉的是 CPU。CPU 是尖峰的 ——99% 的时间空闲,一阵编译,然后又空闲。内存是平的:要么你的服务加上页面缓存 装得下,要么你就换页,而换页换到一块虚拟磁盘上,正是一个便宜套餐悄悄死掉的 方式。买内存,租 CPU。 一台 1 vCPU、2 GB 的机器,对几乎任何自托管 workload, 都比一台 4 vCPU、512 MB 的机器更顺手。

2. 磁盘类型:NVMe 对 HDD,以及标志为什么会撒谎

套餐页面上的「SSD」是一个类别,不是一种度量。你真正想要的是本地 NVMe 或本 地 SATA SSD,而且你要确定它不是被包装成磁盘的网络附加存储。容量是最没意思的 数字——一个静态站点加一个保险库加日志,只占几个 G。你能感觉到的是 IOPS。

有一个值得知道的坑:在虚拟机上,lsblk 里的 ROTA 标志并不可信。这台机器的 虚拟磁盘报告 ROTA=1(旋转),可下面的实测写入速度显然达到 SSD 级别。这个标 志反映的是虚拟机管理程序如何呈现这个设备,而不是它背后的物理介质。相信真实的 dd 测试,别信标志。

3. 每月流量,而不是「带宽」

有两个数字被叫做带宽。端口速度(1 Gbps、10 Gbps)决定一次传输的突发有多 快。每月限额决定你走到多少数据之前会被限速、计费或 nullroute。对于一个博客 或代理,限额才是要紧的那个。一个每月几千次访问的静态站点只移动几十 G,限额很 少成为约束。陷阱是**「无限」**这个词——没有什么无限,总有一条合理使用条款。去 条款里找数字,别信按钮上的字。

4. 机房位置和延迟

越近越好,但距离是最没意思的变量——对等互联和网络质量更要紧。选一个离你近的区 域,敲 SSH 才爽;如果你直接服务读者,再离大多数读者近一点。这台机器离我大多 数读者都很远,正因为如此这个站点才是静态的、带缓存的:源站的延迟几乎无关紧 要,因为字节只搬一次,然后就躺在 CDN 里。

5. IPv6

IPv4 很稀缺,供应商要为它付真金白银,所以有些便宜套餐是纯 IPv6,带一个共享 的、NAT 过的 v4 地址,或者干脆没有。对一个隧道或一个站在 CDN 后面的站点来说,这 没问题;对任何必须接受入站 v4 连接的东西——邮件、堡垒机、游戏服务器——则是 致命的。确认供应商是真的路由 IPv6,而不仅仅是宣传它。IPv6 还给你每个服务一个 可路由地址,让防火墙更干净。

6. 快照和备份

供应商最爱把这两个混为一谈。快照是同一块存储、同一个账号下的即时拷贝—— 非常适合「这次升级前滚回去」,但账号一关、供应商一消失,它就毫无用处。备份 要离开这栋楼。如果他们的快照免费,就用,但把你那份异地拷贝当作真正的安全网。 没有快照,对一个你在意的机器来说,是一个真正的 disqualifier。

7. 支持和面板

面板是锦上添花,支持则不是。当 SSH 挂掉的时候,你能找到人吗,策略有书面记录吗? 这是最便宜套餐和无聊的中档套餐分野的地方。对于一个 hobby 盒子,只要我有真正的 异地备份,我能接受慢速支持。但对任何失败模式是我自己被锁在外面的东西——邮 件、前门——我为支持买单,不为核心数买单。

陷阱,一次列清

  • 超售的「无限」带宽——总有一条合理使用条款。把它找出来。
  • 「1 vCPU」意味着一个共享切片。 邻居在跑构建,能吃掉你那一份。一个诚实 的核心胜过四个繁忙的核心;盯住偷取时间(top 里的 st)。
  • 续费价对比首年促销价。 那个每月 2 美元的套餐,第二年常常是 6 美元。算 稳态成本,别算落地页成本。
  • 没有快照——便宜且常见,但如果这台机器存着状态,就是真正的风险。
  • 磁盘 IO 才是真正瓶颈。 慢磁盘让快 CPU 干等。测它。

这台真实的机器实测表现

这不是一个横评——我没有一排供应商可以 benchmark。它就是一台机器,只读实测, 正是这个博客真正发布所用的那台。以下是它报告的内容:

nproc                          # 1
free -m
               total   used   free  shared  buff/cache   available
Mem:             981    407     63       2         510       415
Swap:           2559    390   2169
df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        14G  8.5G  4.2G  68% /
lsblk -d -o NAME,ROTA,SIZE
NAME ROTA  SIZE
vda     1   14G

一个核心,981 MB 内存,14 GB 磁盘,2 GB swap。swap 不是意外:Astro 构建是这台机 器做的最重的事,在 swap 出现之前,它曾经在一次构建中途把内核 OOM 掉。现在构建 靠 swap 和内存一起撑过去——这正是「一点 swap 没问题,但还是要买内存」的诚实论 据。

dd if=/dev/zero of=/tmp/ddtest bs=1M count=512 oflag=direct 2>&1 | tail -1
512+0 records out
536870912 bytes (512 MiB) copied, 0.465319 s, 1.2 GB/s
dd if=/dev/zero of=/tmp/ddtest bs=1M count=512 2>&1 | tail -1
536870912 bytes (512 MiB) copied, 2.50204 s, 215 MB/s

ROTA=1 标志说「旋转」,但 1.2 GB/s 直写、215 MB/s 过页面缓存说的是另一回事—— 这块虚拟磁盘很快。这里直写那一跑比带缓存那跑更快,因为第二次跑得把第一次的 脏页写回去。教训就是上面那条:测磁盘,别信标志。

单核加密性能,给 TLS 终结器和 VPN 用的:

openssl speed -evp aes-128-gcm -bytes 16 -seconds 3 2>&1 | tail -1
aes-128-gcm     217944.35k        # 单核约 218 MB/s AES

这是一次 TLS 握手突发的上限,对一个小站点来说绰绰有余。再来看一次真实构建时的 负载——这台机器真正干活的那一刻:

cat /proc/loadavg
2.08 1.08 0.48 2/173 417202
ps aux --sort=-%mem | head -3
root  417047  93.0  42.6  ...  node .../astro build
root  417012   0.7   5.8  ...  npm run build
root    268   0.0   2.5  ...  systemd-journald

单核上负载均值 2.08——明显超售了,因为构建恰恰是一种不管你的盒子多小都照压不 误的 workload。这就是诚实的上限:构建是唯一让这台机器吃力的东西,而它照样能 跑完。 相比之下,提供完成的站点根本不算什么。

最够用的便宜盒子,胜过最大的规格表

整个论点用一段话说完。对一个小自托管栈——nginx、一个静态构建、一个网格 VPN、 一个保险库——真正的约束是内存,磁盘只要快,一个核心对除了构建之外的一切都绰 绰有余。一台 1 vCPU / 1 GB / 14 GB、有 NVMe 级 IO、有真实每月限额、路由了 IPv6、 有快照的便宜盒子,不是将就;它就是正确的工具。为你永远用不上的 4 个核心付钱, 不是余量,是花更差的钱买同样的网络。

这些标准,按权衡顺序:先内存,再磁盘速度,再流量限额,再机房位置,再 IPv6,再快照,再支持。 陷阱到处都一样——超售带宽、共享核心 vCPU、促销价对续 费价、没有快照——而且它们在你付款之前查清楚,总是比凌晨 3 点故障时发现要便宜得 多。挑一台刚好装得下你实测占用、还留得出页面缓存和构建峰值空间的最小盒子,留 一份离开这栋楼的备份,然后别再想这台机器了。这就是用一台便宜的 VPS 跑一个 小栈的全部本事。