在Linux云服务器上,当物理内存不足以支撑所有进程运行时,系统可能触发OOM Killer终止关键服务。通过设置swap虚拟内存,可以利用磁盘空间模拟额外内存,缓解瞬时内存压力。swap既可以是独立分区,也可以是普通文件,对多数云主机而言,创建swap文件比调整分区更灵活。

一、什么是swap以及它为什么有用
swap是Linux内核提供的虚拟内存机制,它将磁盘上的一块空间作为内存的补充。当物理内存(RAM)使用率达到临界值,内核的内存管理子系统会根据LRU算法,把近期较少访问的匿名页或缓存页写入swap空间,从而腾出RAM给更活跃的进程。这种机制避免了程序因申请不到内存而直接崩溃。
对于云服务器尤其是入门级实例,往往只配备1GB或2GB内存,运行MySQL、Redis或编译任务时很容易占满。此时若没有swap,轻则服务不可用,重则系统卡死。合理配置swap能给运维人员留出应急处理时间。但需要注意,swap的读写速度远低于RAM,过度依赖会造成延迟升高,因此它只是缓冲而非替代物理内存。
二、创建swap文件的两种常用方式
在云环境中,磁盘通常已分区且不便重划,因此用文件充当swap最方便。fallocate命令能瞬间分配指定大小的文件,适用于支持稀疏文件的文件系统如ext4、xfs。
# 创建一个2GB大小的swap文件 sudo fallocate -l 2G /swapfile # 如果fallocate不可用,可用dd逐块写入(较慢) # sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
创建后必须限制权限,否则其他用户可能读取到内存中的敏感数据。随后用mkswap对文件做swap格式化,让内核识别其结构。
# 设置仅root可读写 sudo chmod 600 /swapfile # 初始化为swap区域 sudo mkswap /swapfile # 立即启用 sudo swapon /swapfile # 查看是否生效 sudo swapon --show
三、开机自动挂载swap
上述swapon命令只在当前运行环境有效,重启后失效。为保证云服务器每次启动都加载swap,需要写入/etc/fstab。该文件记录了挂载信息,系统初始化时会自动处理。
# 备份原文件 sudo cp /etc/fstab /etc/fstab.bak # 追加一行(使用echo或vim编辑均可) echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # 校验语法错误(挂载所有fstab项,无报错即正常) sudo mount -a
添加完毕后,可用free -h命令观察swap行是否显示对应容量。若重启后未生效,应检查文件路径权限及fstab条目拼写。某些云镜像默认禁用swap,还需确认没有在/etc/rc.local中被关闭。
四、调整swappiness优化交换行为
swappiness是内核参数,取值范围0到100,控制倾向使用swap的程度。值越高,越积极把页面换出;值越低,越尽量保留在RAM。默认常为60,对内存小的云服务器可适度调低以减少磁盘IO。
| swappiness值 | 行为特征 | 适用场景 |
|---|---|---|
| 10 | 仅必要时交换 | 数据库等低延迟服务 |
| 60 | 平衡策略 | 通用应用服务器 |
| 100 | 激进交换 | 极度缺内存且可接受慢 |
修改方式如下,临时生效用sysctl,永久则写入配置文件:
# 临时设为10 sudo sysctl vm.swappiness=10 # 永久生效 echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
需注意,swappiness调低不代表不会用swap,只是推迟。若物理内存真不够,仍会交换。另外在SSD云盘上,频繁交换会消耗写入寿命并引起IO抖动,建议配合监控观察si、so字段。
五、关闭与删除swap的正确步骤
当升级了云服务器内存套餐,或swap引起性能问题,可安全卸除。必须先swapoff再删除文件,否则正在使用的页无法释放会导致错误。
# 停用swap文件 sudo swapoff /swapfile # 从fstab移除对应行(手动编辑删掉那一行) # 然后删除文件 sudo rm /swapfile # 确认已无swap free -h
如果曾修改swappiness且不再需要,也可从/etc/sysctl.conf移除该行。整个操作过程不影响在线服务,因为swapoff会将页面移回RAM,前提是RAM当时有足够空闲,因此建议在低负载时执行。
六、容量规划与注意事项
传统经验是swap设为RAM的1到2倍,但现代云主机有不同考量。对小于2GB内存的实例,设2GB swap较稳妥;对4GB以上实例,1GB到2GB通常足够应对突发。数据库类应用应少依赖swap,优先加内存。
此外,部分云厂商的突发性能实例在大量磁盘读写时会被限流,swap可能加剧卡顿。此时用ionice调整优先级或迁移到计算优化型实例更合理。总之,swap是兜底手段,监控内存趋势与及时扩容才是根本解法。