欢迎光临
专业的主机评测网站

Linux VPS内存不足怎么办?Swap添加教程

512MB、1GB内存的VPS,在安装依赖、编译程序或同时运行多个服务时,可能遇到内存不足、程序退出等问题。给主机添加适量Swap,可以为短时内存压力提供缓冲。

Swap是系统用于交换内存页面的空间。使用磁盘文件作为Swap,会占用硬盘容量,也会带来磁盘读写开销。它不能替代物理内存,业务长期内存不足时,仍需要调整程序配置或升级主机。

本文以新增 1GiB Swap文件为例,适用于使用systemd、根文件系统为 ext4或XFS 的常规Debian、Ubuntu VPS。命令在VPS系统中执行,使用root权限。

Linux VPS内存不足时添加Swap交换空间与验证教程

一、先检查内存、磁盘和已有Swap

执行:

free -h
swapon --show
df -h /
findmnt -n -o FSTYPE -T /

四条命令分别查看内存、已启用的Swap、根分区剩余空间和文件系统类型。

检查项目重点看什么
free -hMem行的available,以及Swap行的总量
swapon --show是否已经存在Swap文件、交换分区或zram
df -h /Avail列是否有足够空间
findmnt文件系统是否为ext4或XFS

判断内存是否紧张,不能只看free列。Linux会使用内存缓存文件,available对“不发生交换时还能供新程序使用多少内存”的估算更有参考价值。

如果已经配置了Swap,应先确认容量是否不足。新增1GiB文件需要占用相应磁盘空间,同时还应为日志、数据库和系统更新保留余量。

如果输出是Btrfs、overlay或其他类型,先不要执行本文的创建命令。Btrfs支持Swap文件,但有专门的配置要求;Docker等容器环境也不能直接套用普通VPS的操作方式。

二、创建并启用1GiB Swap文件

下面使用独立路径/swapfile-vps。请以root身份整段执行:

(
  set -e

  case "$(findmnt -n -o FSTYPE -T /)" in
    ext4|xfs) ;;
    *)
      echo "当前文件系统不在本教程适用范围内,停止操作。"
      exit 1
      ;;
  esac

  if [ -e /swapfile-vps ] || [ -L /swapfile-vps ]; then
    echo "/swapfile-vps 已存在,请先检查,不会覆盖。"
    exit 1
  fi

  umask 077

  dd if=/dev/zero of=/swapfile-vps \
    bs=1M count=1024 conv=excl status=progress

  chmod 600 /swapfile-vps
  mkswap /swapfile-vps
  swapon /swapfile-vps
)

这段命令会依次创建文件、限制访问权限、写入Swap格式并启用。任一步骤报错,后续步骤会停止。

其中:

  • bs=1M count=1024创建1GiB文件。
  • conv=excl在目标文件已存在时拒绝写入。
  • chmod 600只允许文件所有者读写。
  • mkswap初始化交换空间。
  • swapon立即启用该文件。

这里使用dd实际写入文件,避免稀疏文件中的“空洞”导致Swap启用失败。不要用truncate直接替换这一步。

如果计划创建2GiB,应在首次执行前将count=1024改为count=2048,并先确认磁盘余量。已经启用的Swap文件不能直接覆盖重建。

三、确认Swap已经生效

执行:

swapon --show
free -h

检查swapon --show中是否出现/swapfile-vps,容量应接近1GiB。如果此前没有其他Swap,free -h的Swap总量也应接近1GiB。

刚启用时使用量为0是正常的,系统会根据实际内存压力决定是否使用。物理内存所在的Mem总量不会因此增加。

四、配置开机自动启用

先备份现有配置:

cp -a /etc/fstab "/etc/fstab.bak-swap-$(date +%Y%m%d-%H%M%S)"

用编辑器打开/etc/fstab,保留原有内容,在末尾添加下面这一行。已有相同路径时,不要重复添加:

/swapfile-vps none swap defaults,nofail 0 0

然后检查配置:

findmnt --verify --verbose

处理检查发现的错误,再重新加载systemd配置:

systemctl daemon-reload

systemd会根据/etc/fstab生成相应的Swap单元。这里的nofail表示,即使这项Swap未能成功启用,系统也会继续启动;它并不代表可以忽略配置错误。

当前Swap已经生效,无需为了添加Swap立即重启。下一次正常维护重启后,再执行swapon --show,确认自动启用成功。

五、观察是否出现频繁换页

添加Swap后,需要结合业务表现观察,而不是只看“还有多少交换空间”。

执行:

vmstat 1 6

这会输出6次报告。第一份报告中的速率统计主要反映开机以来的平均情况,观察当前负载时,重点看后续每秒采样。

字段含义
si每秒从Swap换入内存的数据量
so每秒从内存换出到Swap的数据量
waCPU统计中的I/O等待时间占比

si、so偶尔变化,不足以说明主机存在性能问题。如果持续大量换入换出,同时网站变慢、磁盘繁忙,就需要进一步排查内存压力与存储性能。

可以查看内存占用较高的进程:

ps aux --sort=-%mem | head -n 15

根据实际业务检查PHP-FPM进程数量、数据库缓存、应用并发和后台任务。长期依赖大量Swap运行的业务,应优先降低工作集或增加物理内存。

六、常见问题处理

1.出现“File exists”怎么办?

说明指定路径已经存在。先用swapon --show确认它是否正在使用,再检查文件来源。不要为了重新运行教程直接删除文件。

2.出现“Operation not permitted”怎么办?

确认正在以root身份操作,并检查是否处于受限制的容器环境。Swap操作需要相应系统权限,仅在容器内获得root身份,并不意味着拥有宿主机的Swap管理权限。

3.是否需要把swappiness改成10?

没有适用于所有主机的固定最佳值。可以先查看当前设置:

sysctl vm.swappiness

swappiness用于影响交换I/O与文件页面回收之间的相对取舍,不是“内存剩余百分之几时开始使用Swap”。设置为0也不等于完全禁用Swap。首次添加时可以先保留当前值,再根据业务表现评估。

4.主机已有Swap,Docker容器为什么仍然OOM?

容器可能设置了单独的内存和交换空间限制。比如Docker的--memory-swap与--memory设置相同,意味着该容器不能使用Swap。增加主机Swap不会自动解除容器限制,需要同时核对容器配置。

5.Swap有占用,要不要定期清空?

不应仅因为Swap使用量不为0,就执行swapoff -a。关闭交换空间需要迁移其中的页面,内存不足时可能失败并加重压力。应优先结合available、换页速率和应用响应判断是否需要处理。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。

专业的主机评测网站

国内/国外VPS测评、云服务器评测,从VPS或IDC商家的资质、客服水平、售后服务、VPS线路、服务器硬件、主机性能等、访问速度进行云主机、IDC测评。

联系我们联系我们