Skip to content
VDS · 监控与性能

内存与 swap:何时该升级档位

如何区分正常的内存占用与内存不足,为什么小档位需要 swap,以及依据哪些迹象决定升级到更高方案。

更新于 2026年8月23日

“2 GB 中还有 120 MB 空闲”会吓到新手,在 Linux 上这毫无意义:系统会故意把空闲内存用于文件缓存,因为空着的内存毫无用处。另一列才能反映真实情况。

正确解读 free

free -h
#               total  used   free  shared  buff/cache  available
# Mem:          1.9Gi  742Mi  102Mi    18Mi       1.1Gi      1.0Gi
# Swap:         1.0Gi  126Mi  898Mi

请看 available —— 应用程序通过回收缓存可以拿到多少内存。只要这个值远大于零,机器就没问题。从这个意义上说,free 毫无用处。

危险信号:

  • available 低于 total 的 10%;
  • Swap used 持续增长且不会释放;
  • 在 vmstat 2 中,si/so 非零且恒定 —— 系统在持续向磁盘换页。

究竟是什么在占用内存:

ps aux --sort=-%mem | head -10
smem -tk -s uss 2>/dev/null | tail -10

Swap:需要还是不需要

无论哪个档位,较小的 swap 都有用:它给系统留出空间,把长期未使用的页移走,并在短时峰值期间防止进程瞬间被杀掉。它不能替代内存 —— 磁盘要慢上数百倍。

创建一个 2 GB 的 swap 文件:

fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

抑制系统换页的积极性:

sysctl -w vm.swappiness=10
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swap.conf

请记住,swap 文件会占用档位的磁盘空间(VDS-1 上为 40 GB),写入它还会消耗磁盘速度带宽,参见磁盘负载。

是泄漏还是内存不足

控制面板 /hosting/vds/m/<id> 中按周显示的内存图表有助于区分这两种情况:

  • 锯齿形 —— 增长到上限,服务重启后回落,然后再次增长。这是应用程序泄漏;更高的档位只会推迟问题。
  • 从一开始就在上限处形成平坦的高原 —— 工作集根本放不下。
  • 急剧下降 —— OOM killer 杀掉了进程;参见文章内存不足。

在更换套餐之前,先处理显而易见的问题:限制 journal 的 SystemMaxUse,为数据库设置合理的限制(MySQL 默认要求相当多),移除未使用的服务(systemctl list-units --type=service --state=running),并减少 PHP-FPM 和 Gunicorn 的 worker 数量。

何时升级

如果清理之后 available 连续数周接近零,swap 一直在使用,而您需要整个应用程序,那就选择更高的档位。内存按 2、4、8、16、24、32 GB 的序列递增。升级只能向上,需为剩余天数补差价;不支持降级:磁盘不会缩小。详情请参见文章套餐升级。

常见错误

  • 完全禁用 swap。 在峰值期间,系统会杀掉进程,而不是撑过一分钟。
  • 把 swap 设为磁盘大小。 机器不会死,但会爬行数小时,这比快速崩溃更糟。
  • 在 htop 中看 VIRT。 JVM、PostgreSQL 和 Node 的虚拟大小非常巨大,并不反映实际消耗。请看 RES。

您需要在故障发生前检查内存,而不是事后。设置阈值告警 —— 文章网站宕机告警中有一个简单的做法。