swap | 启用
小内存的服务器,强烈推荐使用 swap,可避免 OOM。
后期要监控 swap 的使用情况。如果 swap 经常使用率过高,说明内存不足。
安装系统时,创建 swap 分区,大小 8G。
- 固定配置,以后安装系统时都按这个标准创建 swap 分区。
| 物理内存 | swap 建议 |
|---|---|
| ≤ 1GB | 1GB |
| ≤ 2GB | 2GB |
| ≤ 4GB | 4GB |
| ≤ 8GB | 8GB |
| ≥ 8GB | 8GB (更多意义不大) |
mkdir -p /data/swapfile
chmod 755 /data/swapfile
AlmaLinux 9 内核 + XFS/EXT4 支持 fallocate
rm -fv /data/swapfile/2G.swap
fallocate -l 2G /data/swapfile/2G.swap
若底层存储不支持 fallocate(极少数情况):
dd if=/dev/zero of=/data/swapfile/2G.swap bs=1M count=2048 status=progress
chmod 600 /data/swapfile/2G.swap
mkswap /data/swapfile/2G.swap
swapoff -a
swapon /data/swapfile/2G.swap
swapon --show
free -m
/data/swapfile/2G.swap none swap defaults 0 0
立即验证(不重启):
swapoff /data/swapfile/2G.swap
swapon -a
swapon --show
free -m
检查 /etc/rc.local 文件,注释或删除 swapon -a 命令。
目标:尽量不用 swap,但作为 OOM 缓冲存在
vi /etc/sysctl.d/99-swap.conf
# 尽量避免使用 swap
vm.swappiness = 10
# 内存回收策略(防止过早 OOM)
vm.overcommit_memory = 1
# 脏页写回控制(稳定优先)
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
# 降低内存碎片压力
vm.min_free_kbytes = 131072
如果是 数据库 / Redis / Elasticsearch
vm.swappiness = 1
不建议设置 vm.swappiness = 0
- 0 并非“完全禁用”
- 在极端内存压力下反而更容易 OOM
sysctl --system
sysctl vm.swappiness
- systemd 会自动生成:
kvm-swapfile.swap
查看状态:
systemctl status kvm-swapfile.swap
列出所有 swap unit:
systemctl list-units --type=swap
| 有 swap | 无 swap |
|---|---|
| 系统更抗突发内存 | OOM 更早 |
| 延迟 OOM | 延迟低但风险高 |
| 更平滑 | 更“硬” |
swap ≠ 性能优化
swap = 系统保险丝
默认 不影响 swapfile
若 swap 无法启用:
restorecon -v /data/swapfile/2G.swap
若 /data/swapfile 在 Btrfs 上:
chattr +C /data/swapfile/2G.swap
否则 swap 会失败
- Docker / Podman / K8S 节点
- 强烈建议保留 swap(但限制使用)
vm.swappiness = 10
mkdir -p /data/swapfile
chmod 755 /data/swapfile
rm -fv /data/swapfile/2G.swap
fallocate -l 8G /data/swapfile/2G.swap
chmod 600 /data/swapfile/2G.swap
mkswap /data/swapfile/2G.swap
swapoff -a
swapon /data/swapfile/2G.swap
echo "/data/swapfile/2G.swap none swap defaults 0 0" >> /etc/fstab
cat >/etc/sysctl.d/99-swap.conf <<EOF
vm.swappiness = 10
vm.overcommit_memory = 1
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.min_free_kbytes = 131072
EOF
sysctl --system
在 AlmaLinux 9 上,swap 文件应作为“低频使用的内存保险”,正确方式是:小 swap + 低 swappiness + 明确 sysctl 控制。