你有没有遇到过这种情况——服务器跑着跑着突然 SSH 都连不上了,一看监控,内存爆了,OOM Killer 已经把你的 MySQL 给干掉了。

如果你用的是那种 1GB、2GB 内存的小机器,这个场景应该不陌生。

Swap(虚拟内存)就是给这种场景兜底的。说白了,它就是硬盘上划出来的一块地儿,当物理内存吃紧的时候,系统把暂时不用的数据丢过去,腾出内存给正在跑的应用。虽然硬盘读写比内存慢得多,但有这个缓冲,至少不会直接崩。

下面一步步来,在你的 Debian 机器上把 Swap 配好。

先看看现在有没有 Swap

动手之前,确认一下当前状态:

sudo swapon --show

如果这条命令没有任何输出,恭喜,你的机器现在一点 Swap 都没有——裸奔状态。

也可以顺手跑一下 free -h,内存和 Swap 的使用情况一目了然:

free -h

创建一个 Swap 文件

现在来创建一个 4GB 的 Swap 文件。为什么是文件而不是分区?因为文件更灵活,扩容、删除都方便,不用动分区表。

sudo fallocate -l 4G /swapfile

个别老系统可能没有 fallocate,那就用 dd 代替:

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

dd 会慢一点,但效果一样。

权限得锁好。 Swap 文件里可能存着内存中的敏感数据,别让其他用户能读:

sudo chmod 600 /swapfile

接着把它格式化成 Swap 格式:

sudo mkswap /swapfile

然后启用它:

sudo swapon /swapfile

搞定了。再用 swapon --showfree -h 确认一眼,Swap 已生效。

重启后别让它消失

上面这样操作,重启后 Swap 就没了。想让它在重启后自动挂载,需要往 /etc/fstab 里加一行:

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

到这步,Swap 配置已经完成了。但还有一个参数,调好了能让你少很多烦恼。

Swappiness:别让系统乱用 Swap

swappiness 控制的是系统有多"愿意"把内存数据往 Swap 里搬,取值范围 0-100。默认是 60,这个值在高内存压力的场景下偏高了——系统会过早地把还在用的数据丢进 Swap,拖慢整体速度。

看一眼你现在的值:

cat /proc/sys/vm/swappiness

如果是 60,建议调到 10 左右。这样系统只有在内存确实快不够了才会动用 Swap,平时优先用物理内存,整体体验会流畅不少。

这里要分版本了。 从 Debian 13(Trixie)开始,/etc/sysctl.conf 不再被 systemd 自动加载,重启后配置会丢失。先确认一下你的版本:

cat /etc/debian_version
Debian 12 及之前版本

直接编辑 /etc/sysctl.conf,加上这行:

echo 'vm.swappiness = 10' | sudo tee -a /etc/sysctl.conf

然后使其生效:

sudo sysctl -p

重启后配置自动加载,不用担心丢失。

Debian 13(Trixie)及之后版本

Debian 13 把 sysctl 配置从单一文件改成了 /etc/sysctl.d/ 目录管理,更加模块化。你得在 /etc/sysctl.d/ 下创建一个 .conf 文件(文件名可以自定义,建议用数字前缀控制加载顺序):

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf

然后让配置生效:

sudo sysctl --system

注意:这里用的是 sysctl --system 而不是 sysctl -p--system 会让 systemd-sysctl 重新扫描 /etc/sysctl.d/ 下的所有配置并加载,确保重启后依然自动生效。

几条命令的事,你的 Debian 就多了一层保护。对于内存紧张的小机器来说,Swap 不是"锦上添花",是实实在在的"救命稻草"。

当然,Swap 不是万能的——如果机器长期 Swap 使用量很高,那说明物理内存确实不够用了,该升级还是得升级。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐