Debian系统Swap虚拟内存配置与参数调优
你有没有遇到过这种情况——服务器跑着跑着突然 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 --show 或 free -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 使用量很高,那说明物理内存确实不够用了,该升级还是得升级。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)