1. Swap简介
1.1. 什么是Swap
swap类似于windows的虚拟内存,工作原理是将内存页复制到硬盘上的预配置空间,以释放该内存页的过程,物理内存和交换空间的组合大小就是可用的内存量。
1.2. Swap的缺点
swap确实有缺点。与内存相比,访问磁盘要慢得多。此外,使用swap会大量消耗磁盘io和cpu的资源,因此swap分区的大小不能设置过高,一般来说物理内存的一半左右便足以。
2. 设置swap
2.1. 设置交换分区(Swap Partition)
一般情况下,云服务器默认没有启用swap。如果不确定可以使用free -m
指令查看swap是否被启用,如果打印出 Swap: 0 0 0
说明没有分区。如果有分区存在可以使用下面的方法删除。
删除 swap 分区
- 停止正在使用的分区
swapoff /var/swapfile
- 删除分区
rm -rf /var/swapfile
创建交换区 swap
- 添加4G大小的 swap
dd if=/dev/zero of=/var/swap bs=1M count=4096
if
是指input file。
of
是指output file。
dev/zero
是linux的一种输入设备,用来创建用于初始化的空文件,如临时交换文件,可以提供任何你需要的数目。
bs
是指block size ,单位数据块block,读入/输出的块字节大小为1024*1024个字节。
count=4096
:数据块(block)数量为4096 ,即4096个1024*1024字节(1024*1024字节=1Mb)可以计算出swap分区的容量为:4G。
- 创建 swap 文件
mkswap /var/swap
- 加载 swap 文件
swapon /var/swap
执行以上命令可能会出现「不安全的权限 0644,建议使用 0600」提示,其实已经激活了,可以忽略。
修改权限:chmod -R 0600 /var/swapfile
。
- 设置系统启动时自动挂载分区(添加到/etc/fstab)
echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab
- 再次查看分区大小验证 swap 分区是否启用
free -m
2.2. 设置交换文件(Swap file)
除了交换分区(swap partition),Linux 还支持交换文件(Swap file),你可以类似于交换分区的方式创建、准备和挂载该文件。
交换文件(Swap file)的优点是不需要找到一个空分区或重新分区磁盘来添加额外的交换空间。
- 使用 dd 命令创建一个1GB的空文件
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
/swapfile
是交换文件的名称,1048576 的计数是以千字节(即1GB)为单位的大小。
- 像准备分区一样使用
mkswap
准备交换文件,但这次使用交换文件的名称:
mkswap /swapfile
- 同样,使用 swapon 命令挂载它
swapon /swapfile
- 设置系统启动时自动挂载分区(添加到/etc/fstab)
echo "/swapfile none swap sw 0 0" >> /etc/fstab
3. Swappiness
swapiness的取值范围为0-100,这个数值决定了电脑物理内存还剩余多少时开始使用swap分区。
swappiness=0
: 表示最大限度使用物理内存,然后才是 swap空间。
swappiness=100
: 表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
linux的默认设置为swappiness=60
,也就是说,当物理内存在使用到100-60=40%的时候,就开始使用swap分区了,这明显违背了「当内存不足时使用swap分区」的初衷,因此我们要学会修改swappiness的数值。
3.1. 查看swappiness的数值
cat /proc/sys/vm/swappiness
3.2. 改变 Swappiness 数值
临时更改Swappiness 值
- 临时调整的方法如下,我们调成10:
# 方法1:
[root@timeserver ~]# sysctl vm.swappiness=10
vm.swappiness = 10
# 方法2:
[root@timeserver ~]# echo 10 > /proc/sys/vm/swappiness
新值会立即使用,无需重新启动。
永久更改Swappiness 值
- 要想永久调整的话,需要在/etc/sysctl.conf加上:
[root@timeserver ~]# cat /etc/sysctl.conf
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=10
- 激活设置
[root@timeserver ~]# sysctl -p