跳转到内容
严选跨境网络服务与流媒体推荐
实机测速保障 · 专属折扣
声明:以上服务由影迷漫游评测实验室进行晚高峰抽测与流媒体解锁验证。专属链接包含推广支持,不增加您的购买成本。

Linux Swap 配置指南:什么时候需要、配多大、怎么配稳 ​

Linux Swap Virtual Memory

小内存 VPS 有个经典死法:平时跑得好好的,某天装个面板、起几个容器,或者编译个东西,系统突然卡死,服务莫名其妙被杀掉,日志里只剩内核因内存耗尽而杀进程的记录。这种时候,Swap 就是一道便宜的保险:它不能让机器变快,但能让机器在内存见底时不至于直接倒下。

Swap 是什么 ​

Swap 是硬盘上划出来的一块空间,供内核在物理内存不够用时周转。内核管理内存的基本单位是页,当内存吃紧时,它会把一部分暂时不用的内存页写到 Swap 里,腾出物理内存给当前急需的任务;等那些页又被访问时,再从磁盘读回来。这个写出和读回的过程,分别叫换出和换入。

理解 Swap 的关键,是先接受它的速度定位。内存的访问延迟在纳秒量级,磁盘即使是固态盘也在微秒到毫秒量级,机械盘更慢。换页一旦频繁发生,程序就会明显变慢,因为它每一步都在等磁盘。所以 Swap 的正确角色是缓冲垫,不是内存的替代品:一台靠 Swap 常年维持运行的机器,本质上是一台内存不够的机器,Swap 只是让它死得慢一点、死得体面一点。

还有一个要警惕的状态叫抖动:内存实在太小,内核不停地把页换出又换入,CPU 时间全花在搬运数据上,正常任务反而得不到推进。出现抖动时,加 Swap 解决不了问题,反而可能让卡顿拖得更久——这时该做的是减负载或者加内存。

内核在决定换出哪些页时,并不是随机挑的。它优先换出那些长时间没有被访问的页,也就是所谓的不活跃页;正在被频繁读写的热数据,内核会尽量留在物理内存里。这个机制决定了 Swap 的实际体验:后台挂着的闲置进程被换出去,几乎感觉不到;正在跑的任务一旦被换出去,下一次访问就要等一次磁盘读取。所以同样是“用了 Swap”,闲置任务多和活跃任务多,体感完全不同。看 Swap 使用量时,最好连同它在换入换出上花的时间一起看,只看占用数字容易误判。

载体上还有文件和分区两种选择。Swap 文件就是普通文件,创建、调整、删除都方便,不用动分区表,是现在最常见的做法;Swap 分区需要预留磁盘空间,调整起来麻烦,但历史上被认为开销更小。以今天的内核来说,两者的性能差距已经很小,除非装机时就已经分好了专用分区,否则没有必要为了 Swap 专门去改分区,新手直接用文件是最省事的选择。

什么时候需要 Swap ​

先说值得配的情况。第一类是小内存 VPS,尤其是 512MB 到 1GB 这种规格,上面还跑着面板、容器或者数据库。数据库和容器平时不一定吃满内存,但备份、重启、编译这类突发操作会瞬间冲高,Swap 能接住这一波峰值,避免进程被杀。第二类是负载有明显波峰的机器,比如白天平稳、深夜跑定时任务,或者偶尔编译一次大项目:峰值过去之后,内存需求回落,Swap 里的页慢慢就没用了,这种场景下 Swap 的性价比最高。第三类是后台常驻着一些低频任务的机器:它们大部分时间不被访问,内核可以安心地把它们换到磁盘上,把宝贵的物理内存留给前台服务。

再说不值得配、或者说配了也解决不了问题的情况。内存已经很充裕、负载常年平稳的机器,配 Swap 纯属摆设,内核几乎不会碰它。延迟敏感的服务也不适合依赖 Swap:一次换入带来的停顿,对实时性要求高的应用来说就是一次故障。还有一种情况最容易被误判:Swap 长期占用很高。这通常不是“Swap 配小了”,而是物理内存长期不足的信号,正确动作是查哪个进程在吃内存、能不能减配置、该不该升级规格,而不是把 Swap 再加大一倍。

大小怎么定 ​

关于 Swap 配多大,网上流传着不少死板公式,比如一律配内存的两倍。这些公式的问题在于,它们把不同用途的机器当成了同一种机器。更靠谱的办法是按三点来定:物理内存有多大、硬盘余量有多少、工作负载是什么形态。

内存越小,Swap 的相对意义越大。512MB 的机器,配 1GB 左右的 Swap 是常见的起点:这个量级足够接住一次突发峰值,又不至于吃掉太多磁盘。1GB 到 2GB 的机器,Swap 配到和内存相当或者一半,都是合理的选择,具体看上面跑的东西有多容易冲高。内存到了 4GB 以上,Swap 更多是兜底性质,配 1GB 到 2GB 足矣,配得再大,内核平时也不会去用,白占磁盘。

硬盘余量是硬约束。Swap 文件实打实地占磁盘空间,磁盘本身快满的机器上硬配大 Swap,是拆东墙补西墙。动手之前先看一眼剩余空间,留出系统日志、备份和正常增长的余地。另外,Swap 不是休眠用的:服务器不需要像笔记本那样把全部内存写进 Swap 来休眠,所以“Swap 必须大于内存”这条桌面时代的经验,在服务器上并不适用。

磁盘本身的类型也值得考虑一层。本地固态盘上的 Swap,换入换出虽然慢,但至少是可预期的慢;某些云厂商的云盘走网络链路,延迟和抖动都更大,Swap 在这种盘上会更难用。如果你的 VPS 磁盘本身就是网络盘,Swap 只能当作更底线的保险,配小一点、调低 swappiness,让内核尽量少碰它,反而是更稳妥的做法。反过来,磁盘性能越好,Swap 兜底的体验就越接近“慢一点但能跑”,这也是为什么同样的 Swap 配置在不同机器上表现差异很大的原因之一。

最后提醒一句:Swap 配多大,都掩盖不了内存泄漏。如果 Swap 占用一直在缓慢增长、从不回落,先去查进程,而不是加 Swap。泄漏的进程最终会把 Swap 也吃满,到时候死法只会更难看。

手动配置步骤 ​

网上有不少一键脚本,原理和下面这些步骤一样。但脚本是别人写的,执行前看不懂它在干什么,就不要直接跑。下面只讲手动步骤,每一步都知道自己在改什么。

第一步是检查现状。下面的命令会显示内存和 Swap 的使用情况,Swap 那一行如果全是零,说明当前没有启用 Swap。

bash
free -h

第二步是创建一个文件作为 Swap 载体。这里以 2GB 为例,路径放在根目录。fallocate 创建得很快,大多数文件系统都支持:

bash
fallocate -l 2G /swapfile

如果 fallocate 在你的文件系统上报错,可以用 dd 代替。它是逐块写入,速度慢一些,但兼容性更好:

bash
dd if=/dev/zero of=/swapfile bs=1M count=2048

第三步是收紧权限并格式化。Swap 文件里将来会存放内存数据的副本,权限必须只有 root 能读写,否则系统会拒绝启用,这也是安全上的硬性要求:

bash
chmod 600 /swapfile
mkswap /swapfile

第四步是启用。执行后,再运行一次 free -h,Swap 那一行就应该显示出 2GB 左右的容量:

bash
swapon /swapfile

第五步是让它重启后仍然生效。前面几步只对当前这次开机有效,重启之后 Swap 就会消失,所以要把这一行追加到系统的挂载表里:

bash
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

追加完之后,可以用下面这条命令验证挂载表写得对不对。它会按挂载表重新挂载一遍,但不会真的重启机器,没有报错就说明配置无误。远程改挂载表还有一个习惯值得养成:验证之前不要断开当前会话。万一挂载表写错导致下次启动出问题,当前这个还连着的会话就是你的逃生通道,可以立刻把写错的那一行改回来。等验证通过、确认无误之后,再断开也不迟:

bash
mount -a

以后如果想调整 Swap 大小,流程是先停用、再改文件大小、重新格式化、重新启用。停用时要注意:正在使用的 Swap 必须小于目标大小,否则停用会失败,得先释放内存占用再操作:

bash
swapoff /swapfile
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

验证与日常注意 ​

配置完之后,有两条命令值得记住。free -h 看总量和使用量,swapon --show 看当前启用的 Swap 有哪些、各自多大、优先级如何。两者对得上,说明配置真正落了地:

bash
free -h
swapon --show

接下来是一个经常被误解的参数:swappiness。它控制内核使用 Swap 的积极程度,取值范围是 0 到 100。数值越低,内核越倾向于守住物理内存,不到迫不得已不动 Swap;数值越高,内核越早就把不常用的页往磁盘里搬。系统默认值一般是 60,对服务器来说偏积极,很多人会把它调低,比如调到 10,让物理内存优先被充分利用:

bash
sysctl -w vm.swappiness=10

这条命令只对当前生效,重启后失效。想持久化,就把下面这一行写进系统控制配置文件,再应用一次:

bash
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

要理解的是,swappiness 只是一个倾向,不是开关。把它设成 0 也不等于禁用 Swap,内存真正耗尽时内核仍然会换页;把它设高,也不会让内核无缘无故把所有数据都往磁盘里写。它调的是“多积极”,不是“用不用”。

日常监控主要看两个信号。一是 Swap 的使用量是不是在持续爬升:偶尔用一点、峰值过去又回落,是正常现象;一路上涨从不回落,要去查进程。二是换页频率,vmstat 1 输出里的换入换出两列如果持续非零,说明系统正在频繁换页,性能已经受影响,这时候该考虑的是减负载或加内存,而不是调参数。至于固态盘磨损,现代固态盘的写入寿命通常远高于一台 VPS 的正常 Swap 写入量,配上较低的 swappiness 之后,这方面的顾虑基本可以忽略。

读 free -h 的输出时,还有一个常见的误读要纠正:空闲内存小不等于内存不够。输出里的可用内存一栏,已经把缓存和缓冲里可以随时回收的部分算进去了,真正要看的是可用内存是不是长期见底,而不是空闲那一栏是不是接近零。Linux 本来就会把空闲内存拿去做磁盘缓存,这部分内存在需要时可以立刻让出来,所以一台缓存占得很满的机器完全可能是健康的。判断内存压力,要结合可用内存、Swap 使用量和换页频率一起看,单看任何一个数字都容易下错结论。

如果某天确认不再需要 Swap,停用也很简单:先停用全部 Swap,再把挂载表里对应的那一行删掉或注释掉,最后把文件删掉。删文件之前确认 free -h 里 Swap 已经归零,避免删掉正在使用的文件:

bash
swapoff -a
rm /swapfile

说到底,Swap 是给内存上的一份保险:它存在的意义,是让小机器在峰值面前多一次活下来的机会,而不是让一台内存不足的机器假装内存充足。配多大、调多积极,都服务于这个定位。理解了这一点,配置本身只是几条命令的事。


延伸阅读 ​

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。