SWAP是什么?SWAP有什么用?SWAP怎么用?

时间:2022-10-21 16:00:47

写这个帖子的原因是有网友在广告中国论坛问怎么样才能删除掉 VPS 的SWAP 分区,大伟哥借机会在这里对VPS新手和站长管理员做个有关Linux SWAP 的基础小科普,是给新手看的,高深的东西大伟哥是真的不会。

一、什么是 SWAP?SWAP 有什么用?

 

swap 是类 Unix 操作系统下虚拟内存技术的实现。简单地说,swap 文件或者 swap 分区(交换区)就是把一部分硬盘空间拿出来,模拟成备用的内存给 linux 使用。Linux 系统在运行中会把内存中暂时用不到的部分数据放在 swap 分区中保存,把宝贵的内存资源分配给其他更加需要内存的程序使用。

SWAP是什么?SWAP有什么用?SWAP怎么用?

合理地配置和使用 swap,可以让 Linux 在有限的硬件配置下完成更多的处理任务。另外,有了 swap 的缓冲,还可以避免 linux 系统做出一些过激的保护机制(OOM),在内存不够用的情况下杀死某些虽然占用内存很多但却非常重要的服务进程,比如mysql数据库服务。作为一台网站服务器,底层的数据库进程没有了,web server 即使还在运行,取不到数据又有什么用呢?所以有些主机商比如 Linode 会在管理面板里直接提供相应的功能,让你很方便地创建 swap 分区。

然而,swap 毕竟是硬盘虚拟出来的假的内存,比起物理内存的读取速度来肯定是非常渣的,同时,如果频繁地在内存和 swap 之间进行 IO 操作,也会带来额外的系统开销。因此过多的依赖 swap 分区,可能会拖慢系统的性能。这也是为什么有些主机商比如阿里云不推荐你使用 swap 的原因(你可以加钱升级到更大内存的套餐啊亲)。

大伟哥个人认为,在目前云服务器内存还不是很大的情况下,swap 还是需要使用的,至少大伟哥自己就碰到过因为数据库进程被强行 kill 引起的网站崩溃问题。如果怕占用太多硬盘空间,你可以把 swap 设置小一点。另外,为了让系统尽量少使用 swap 而多使用物理内存,还可以通过调低 swappiness 参数来实现。

二、如何使用 SWAP?

 

使用 swap 有两种方式,一种是创建 SWAP 分区即交换分区,另一种是使用 swap 文件。

以前有一种说法是 swap 分区比 swap 文件在速度上要快一些,但是在 linux 内核 2.6.x 及以后版本,这两种方法在性能和速度上其实很接近了,特别是 swap 文件是连续存放在硬盘里的情况下。而且 swap 文件比 swap 分区更灵活,可以放在硬盘的任何目录下,并且随时调整大小。基于这两种不同方式各自的优缺点,你可以根据实际情况选择使用哪种方式。

1、可以使用 swap -s 命令查看 swap 设置的情况。

  1. daweibro@aliyun:~$ swapon -s
  2. Filename               Type        Size    Used    Priority
  3. /var/swap              file        2097148    0    -1

上面是大伟哥阿里云 ECS 的情况,说明 swap 是文件的形式,大小是 2 GB 左右,文件位于/var/目录下面。

  1. daweibro@Workstation:~$ swapon -s
  2. Filename                Type        Size    Used    Priority
  3. /dev/dm-2               partition   3999740    0    -1

上面是大伟哥工作用电脑的情况,这里 swap 是独立分区的形式,大小 4GB 左右。

2、使用 top 或者 free -m 命令可以查看当前内存和 swap 具体的使用情况。这里我们以 free -m 为例:

  1. daweibro@aliyun:~$ free -m
  2.              total       used       free     shared    buffers     cached
  3. Mem:           992        875        116         65        101        370
  4. -/+ buffers/cache:        404        588
  5. Swap:         2047          0       2047

以上 Mem 部分第一二行是物理内存的使用情况 ,最后一行就是 swap 的使用情况了。完全没用到,说明目前阿里云的 ECS 很悠闲,一点也不累。

  1. daweibro@Workstation:~$ free -m
  2.               total        used        free      shared  buff/cache   available
  3. Mem:          19954       10761        6701         416        2492        8327
  4. Swap:          3905           0        3905

工作用的电脑也还行,内存占用率更低,交换分区也没用上。

3、创建 swap 分区或者 swap 文件。

创建 swap 分区要用到分区工具比如 fdisk 或者 parted,这里大伟哥就不讲了,只是提醒一下,磁盘操作需要小心谨慎,万一丢失数据就不好了。

要创建 swap 文件,可以用 dd 命令,下面的例子就是在/根目录下创建一个 2048 GB 大小的文件,名称是 swapfile:

  1. dd if=/dev/zero of=/swapfile bs=1M count=2048

给予合适的权限:

  1. chmod 600 /swapfile

4、建立 swap 的文件系统:

  1. mkswap /swapfile

如果你创建的是 swap 分区/dev/sdb,则需要用同样的命令对 swap 分区进行格式化:

  1. mkswap /dev/sdb

5、建立 swap 的文件系统:

  1. swapon /swapfile

或者:

  1. swapon /dev/sdb

6、编辑/etc/fstab 文件,在文件末尾根据情况加入下面这两行中的一行,然后保存退出,再重启系统运行 swapon -s 或者 top/free 命令应该就能看到新添加的 swap 交换区了。

  1. /swapfile none swap defaults 0 0

或者:

  1. /dev/sdb none swap defaults 0 0

7、如果你做了一个艰难的决定,要和之前的 swap 交换区说再见,只要反方向操作就可以了。首先 swapoff,然后删除 swap 文件或分区:

  1. # swapoff -a
  2. # rm -f /swapfile

最后把之前加入/etc/fstab 文件的行删除就好了。

三、如何使用 swappiness 参数设置用好 SWAP?

 

论坛上的朋友因为担心 swap 的使用会拖慢系统,所以才发贴寻求删除 swap 交换分区的方法,其实不用过分担心这一点,因为 linux 肯定不会那么傻,放着大量空闲的物理内存不用而去使用慢得多的 swap。就如大伟哥前面的例子,不管是 1 GB 内存的阿里云 ECS 服务器,还是 20 GB 内存的工作站,在物流内存还有富余的情况下,linux 默认是用不到 swap 分区的。如果到了大量使用 swap 分区的时候,那物理内存肯定是不够用了,这时候没有 swap 分区反而性能下降会更明显。所以没有太大的必要去删除 swap 分区。

何况我们还有一个很有用的参数 swappiness 可以调整。swappiness=0 的时候表示最大限度使用物理内存,swappiness=100 的时候表示积极的使用 swap 分区,并且把内存上的数据及时的搬运到 swap 空间里面。当然参数为 0 的时候并不是说要等物理内存完全用光以后才开始用 swap 的,网络上有关于这个参数的算法说明,感兴趣的话可以自己去搜索,大伟哥这里知其然不知其所以然,就不在这里装逼了。

一般 linux 默认的 swappiness 参数是 60。你可以试着调小一些,比如说设置成 10。以下是几个有关 swappiness 操作的命令说明:

1、查看你的系统里面的 swappiness

  1. cat /proc/sys/vm/swappiness

2、修改 swappiness 值为 10:

  1. $ sudo sysctl vm.swappiness=10

上面这条命令只是临时性的修改,重启系统后会恢复成默认的 60,如果需要永久性的设置,可以修改/etc/sysctl.conf 文件,在这个文档的最后加上下面这样一行代码然后保存:

  1. vm.swappiness=10