最常用、最可控的手段是直接用 mkswap 和 swapon 增加交换文件,无需重启或改动分区,适用于云服务器等内存受限场景;需先检查 swap 状态,再用 fallocate 或 dd 创建文件,chmod 600 设置权限,mkswap 格式化,swapon 启用,并通过 fstab 持久化及调低 swappiness 至 10 确保生产稳定。

直接用 mkswap 和 swapon 增加交换文件,是生产环境应对内存突发压力最常用、最可控的手段。它不依赖重启,不改动分区结构,适合云服务器、容器宿主机、边缘设备等无法轻易扩容物理内存的场景。
确认当前 Swap 状态与必要性
先看系统是否真缺 Swap,避免重复或无效操作:
- 运行
swapon --show:无输出 = 当前无活跃 Swap;有输出则记下路径,后续需避免冲突 - 执行
free -h:重点看 “Swap” 行的 total 是否为 0;再看 “Mem” 行的 available 是否持续低于 500MB(小内存)或 1GB(中大型服务) - 检查
dmesg -T | grep -i "oom\|killed process":若出现 OOM Killer 日志,说明已发生内存硬击穿,必须立即干预
创建并安全初始化交换文件
推荐优先使用 fallocate(快、低磨损),失败时回退到 dd:
-
fallocate 方式(推荐):
sudo fallocate -l 4G /swapfile(4G 示例,按需调整) -
dd 方式(兼容兜底):
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096,完成后加sync - 严格设权限:
sudo chmod 600 /swapfile(内核拒绝启用任何非 600 权限的 swap 文件) - 格式化为交换区:
sudo mkswap /swapfile(此步标记文件结构,不写入数据)
启用并验证交换文件生效
启用后必须验证是否真正被内核识别和调度:
- 激活:
sudo swapon /swapfile - 确认启用:
swapon --show应显示该文件,type 为 file;free -h中 Swap total 应同步更新 - 模拟压测验证(可选):
stress-ng --vm 1 --vm-bytes 3G --timeout 60s(需提前安装 stress-ng),观察 Swap used 是否上升、系统是否未卡死或 kill 进程
持久化与关键调优
仅临时启用不够,生产环境必须确保重启不失效,并抑制过度换入换出:
- 写入 fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab - 降低换页倾向:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swap.conf && sudo sysctl -p(默认 60 易导致过早换出,10 更保守) - (可选)禁用透明大页:
echo 'transparent_hugepage=never' > /sys/kernel/mm/transparent_hugepage/enabled,避免 swap 与 THP 冲突引发延迟尖刺











