Skip to content

系统增加 SWAP 虚拟内存

系统的 RAM 量推荐的交换空间如果允许休眠,推荐的空间
≤ 2 GBRAM 容量的 2 倍RAM 容量的 3 倍
> 2 GB – 8 GB等于 RAM 的数量RAM 容量的 2 倍
> 8 GB – 64 GB至少 4 GBRAM 容量的 1.5 倍
> 64 GB至少 4 GB不建议休眠
shell
# 看 SWAP 分区大小
free -h
[root@VM-4-8-centos ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           2.0G        1.4G         74M        676K        511M        421M
Swap:            0B          0B          0B
  • total:总内存,即系统可用的物理内存总量。

  • used:已使用内存,指已经被程序或服务占用的内存量。

  • free:空闲内存,指完全未被使用的内存量。

  • shared:共享内存,指多个进程间共享的内存部分。

  • buff/cache:缓冲区/缓存,这部分内存被用来缓存文件数据和作为磁盘操作的缓冲区,当系统需要更多内存时,这部分内存可以被迅速回收。

  • available:可利用内存,指在不影响系统性能的情况下,应用程序可立即使用的内存量。这个值考虑了缓冲区和缓存的影响,因此比 free 列显示的空闲内存量要多。

方式一:添加 swap 文件

添加一个 swap 文件作为 swap

shell
# 使用 dd 命令创建名为 swapfile 的 swap 交换文件(文件名和目录任意)
[root@VM-4-8-centos ~]# dd  if =/dev/zero  of =/var/swapfile  bs = 4K  count = 1024000
1024000+0 records in
1024000+0 records out
4194304000 bytes (4.2 GB) copied, 14.4986 s, 289 MB/s

# 对交换文件格式化并转换为 swap 分区
[root@VM-4-8-centos ~]# mkswap /var/swapfile
Setting up swapspace version 1, size = 4095996 KiB
no label, UUID=42400245-48e5-434f-abc6-670605ef4539

# 挂载并激活分区
[root@VM-4-8-centos ~]# swapon /var/swapfile
swapon: /var/swapfile: insecure permissions 0644, 0600 suggested.

# 执行以上命令可能会出现:“不安全的权限 0644,建议使用 0600”类似提示,
# 不要紧张,实际上已经激活了,可以忽略提示,也可以听从系统的建议修改下权限:
[root@VM-4-8-centos ~]# chmod -R 0600 /var/swapfile

# 查看新 swap 分区是否正常添加并激活使用
[root@VM-4-8-centos ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           2.0G        1.4G         69M        700K        512M        422M
Swap:          3.9G          0B        3.9G

# 修改 fstab 配置,设置开机自动挂载该分区
[root@VM-4-8-centos ~]# echo  "/var/swapfile swap swap defaults 0 0" >> /etc/fstab

# 查看是否已经使用了交换内存
[root@VM-4-8-centos ~]# top
top - 17:09:50 up 27 days,  1:46,  1 user,  load average: 0.00, 0.04, 0.08
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.0 us,  3.0 sy,  0.0 ni, 93.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2046504 total,    71732 free,  1457020 used,   517752 buff/cache
KiB Swap:  4095996 total,  4095996 free,        0 used.   426936 avail Mem

方式二:新建 swap 分区

新建分区作为 swap 分区

shell
# 查看当前的分区情况
[root@VM-4-8-centos ~]# lsblk
NAME   MAJ: MIN RM   SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 223.6M  0 rom  
vda    253:0    0    50G  0 disk 
└─vda1 253:1    0    50G  0 part /

# 假设新建了一个分区 /dev/sdb1,使用 fdisk 或 parted 创建。
# 格式化新的 swap 分区
sudo mkswap /dev/sdb1
# 启用新的 swap 分区
sudo swapon /dev/sdb1
# 为了让 swap 设置在系统重启之后依然有效,需要将它添加到 /etc/fstab 文件中
echo '/dev/sdb1 none swap sw 0 0' | sudo tee -a /etc/fstab

更改 swap 权重配置

一般默认的情况,当我们开启交换虚拟内存空间后,默认好像是当内存使用百分 50 的时候,就会开始使用交换空间,这样就会造成一个情况,就是本身物理内存还没有使用完成, 就去使用虚拟内存,这样肯定会影响我们的使用效率,那么我们怎么避免这个情况的发生呢?

答案就是:可以通过 swappiness 值进行管理,swappiness 表示系统对 Swap 分区的依赖程度,范围是 0~100,数值越大,依赖程度越高,也就是越高越会使用 Swap 分区。

所以,我们现在并不希望我们的机器过度依赖 Swap 分区,只有当我们 负载超过某个百分比的时候,才使用交换空间,所以这也决定了,我们这个值并不是非常大,一般设置 10 ~50 左右。

当然如果小伙伴的是 SSD 的话,那么这个值可以稍微大一些。

shell
# 下面我们查看当前的 swappiness 数值
[root@VM-4-8-centos ~]# cat /proc/sys/vm/swappiness
30

# 修改 swappiness 值,这里以 10 为例
[root@VM-4-8-centos ~]# sysctl vm.swappiness = 10
vm.swappiness = 10

# 设置永久有效,重启系统后生效
[root@VM-4-8-centos ~]# echo "vm.swappiness = 10" >> /etc/sysctl.conf

删除 swap

shell
# 查看目录
[root@VM-4-8-centos ~]# swapon -s
Filename				Type		Size	Used	Priority
/var/swapfile             file	     4095996	0	     -2

# 停止正在使用 swap 分区
[root@VM-4-8-centos ~]# swapoff /var/swapfile

# 删除 swap 分区文件
[root@VM-4-8-centos ~]# rm -rf /var/swapfile

# 删除或注释掉我们之前在 fstab 文件里追加的开机自动挂载配置内容
[root@VM-4-8-centos ~]# vim /etc/fstab
# 删除以下内容(整行删除)
/var/swapfile   swap  swap  defaults  0  0