swap 有两种主要形式,swap文件swap分区

使用 swapon -s 或者 swapon -show 查看当前已启用 swap

swapoff xxxx 关闭swap

启用swap分区

提前创建好sda2为swap分区

1
2
3
4
5
6
mkswap /dev/sda2

swapon /dev/sda2

# 编辑fstab
/dev/sda2 none swap defaults 0 0

创建swap文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 用三种方法创建都可以
dd if=/dev/zero of=/swapfile bs=1M count=2048

fallocate -l 2G /swapfile

mkswap -U clear --size 2G --file /swapfile


# 修改文件权限,避免其他用户误触
chmod 600 /swapfile

# 格式化为swap文件
mkswap /swapfile

# 启动swap文件
swapon /swapfile

# 添加到fstab
/swapfile none swap defaults 0 0

配置swappiness

swappiness 数字越大表示越积极的把较少使用的匿名内存交换到swap

查看当前cat /proc/sys/vm/swappiness 默认值一般是 60

服务器低延迟或PC桌面 建议调低,尽可能使用物理内存,一般默认即可

临时设置

sudo sysctl -w vm.swappiness=100

永久设置

1
2
3
4
5
6
7
sudo tee /etc/sysctl.d/99-swappiness.conf <<'EOF'

vm.swappiness=100

EOF

sudo sysctl --system

zram 和 zswap

zram:在内存里压缩数据 /dev/zram0

zswap:在硬盘swap之前创建一个压缩缓冲

查看当前swap实时状态 vmstat 1

zram

安装 systemd-zram-generator

创建或编辑 /etc/systemd/zram-generator.conf

[zram0]
zram-size = min(ram / 2, 4096)
compression-algorithm = zstd
swap-priority = 100

内存的一半 但不会超过4G

[zram0]
zram-size = zram-size = ram / 2
compression-algorithm = zstd
swap-priority = 100

内存的一半

重启验证一下 swapon --show zram 状态 zramctl free -h

zswap + swapfile

确认 swapfile 已经启用 swapon --show,添加内核参数到GRUB

etc/default/grub 添加到 GRUB_CMDLINE_LINUX="..."

zswap.enabled=1 zswap.compressor=zstd zswap.zpool=zsmalloc zswap.max_pool_percent=20

Debian系列

update-grub

Red Hat 系列

grubby --update-kernel=ALL --args="zswap.enabled=1 zswap.compressor=zstd zswap.zpool=zsmalloc zswap.max_pool_percent=20"

查看默认内核启动项

grubby --info=DEFAULT

删除

grubby --update-kernel=ALL --remove-args="zswap.enabled zswap.compressor zswap.zpool zswap.max_pool_percent"

重启后检查

cat /proc/cmdline
cat /sys/module/zswap/parameters/enabled
cat /sys/module/zswap/parameters/compressor
cat /sys/module/zswap/parameters/zpool
cat /sys/module/zswap/parameters/max_pool_percent