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