在服务器内存不足而影响到服务器响应能力甚至导致应用程序出错时,为 Linux 设置 Swap 交换分区无疑是一个折中的解决办法。
介绍
Amount of RAM in the system |
Recommended swap space |
Recommended swap space if allowing for hibernation (开启休眠功能) |
<= 2GB |
2 times the amount of RAM |
3 times the amount of RAM |
> 2GB – 8GB |
Equal to the amount of RAM |
2 times the amount of RAM |
> 8GB – 64GB |
At least 4 GB |
1.5 times the amount of RAM |
> 64GB |
At least 4 GB |
Hibernation not recommended |
查看 swap 命令
sudo swapon -s
# 查看挂载情况
cat /proc/swaps
当然,我们也可以使用最常用的 free 命令来查看当前系统是否存在 Swap 交换分区:
free -m
划分交换文件最佳的方式就是将其放到一个单独的分区当中,当然,如果无法单独为其划分的话也可以在已有的分区上创建新的交换文件。但在创建新的 Swap 交换分区或创建交换文件之前,我们需要通过如下命令了解下当前系统对磁盘空间的使用情况:
df -h
确定好磁盘的空闲空间后,你已经可以根据你自己的实际情况来决定如何划分和创建 Swap 交换分区了。一般情况下,创建 Swap 分区的大小都为当前系统使用的物理内存大小或内存大小的倍数。
创建 Swap 分区文件
要在 Ubuntu/CentOS 中要创建 Swap 分区主要有如下 2 种方式:
- dd 创建方式
一般情况下,我们都会使用 dd 命令来预先创建交换分区文件,然后再用 /dev/zero 将该文件的内容全部置零,创建时还将用到 bs 参数来设置要创建的交换空间大小,以及使用 count 来指定要创建的 block 数。例如,我们要创建 4G 的交换分区文件可以使用如下命令:
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
- 快速创建方式
你可能已经注意到了,上述方式创建 Swap 交换文件的过程比较慢,如果想快速创建交换分区可以使用 fallocate 程序来实现。该命令会立即创建一个预分配的交换文件,而产是按实际大小写入分配的大小。如果同样是要创建 4G 大小的交换创建文件,快捷创建方式的命令如下:
sudo fallocate -l 4G /swapfile
swap 挂载还可能在 initramfs
中
启用 Swap 分区文件
我们的 swapfile 交换文件已经创建好了,但 Ubuntu/CentOS 还不知道它是被用作交换分区,所以我们还需要将此文件格式化为 Swap 分区交启用它。
首先,我们需要使用如下命令更改下 swapfile 文件的权限,以避免其被无意理性到:
sudo chmod 600 /swapfile
然后,我们需要用如下将 swapfile 初始化为交换文件:
sudo mkswap /swapfile
最后,还需要使用如下命令来启用交换文件:
sudo swapon /swapfile
配置启用时挂载 Swap 分区文件
Swap 交换文件虽然已经配置好并已经启用了,但 Ubuntu/CentOS 在重启后是不会挂载我们刚创建的交换分区文件的,因此我们还需要对 /etc/fstab 文件进行更改,让其在系统启动时就自动挂载我们创建的 /swapfile 文件。
开机自启动新添加的 swap 分区:
vim /etc/fstab
/swapfile swap swap defaults 0 0
swap 的扩展与删除
swap 分区的扩展很简单,但是需要 root 用户权限
从/分区分出 8x1024M 大小的空间,挂在/swap 上
dd if=/dev/zero of=/swapfile bs=1024M count=8
格式化成 swap 格式
mkswap /swapfile
激活/swap,加入到 swap 分区中
swapon /swapfile
如果不想使用需要删除,只需要执行
swapoff /swapfile
swappiness 控制 swap 的使用
# 查看 swap 使用策略
cat /proc/sys/vm/swappiness
- swappiness=0 表示最大限度使用物理内存,默认值
- swappiness=100 表示积极的使用 swap 分区
推荐设置为 10
# 临时
sudo sysctl vm.swappiness=10
# 永久
$ vi /etc/sysctl.conf
vm.swappiness = 10
# 生效
sysctl -p