SWAP问答:SWAP是什么?SWAP有什么用?SWAP怎么用?

大伟哥 提交于 2018-06-20,周三, 15:48

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

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

swap是类Unix操作系统下虚拟内存技术的实现。简单地说,swap文件或者swap分区(交换区)就是把一部分硬盘空间拿出来,模拟成备用的内存给linux使用。Linux系统在运行中会把内存中暂时用不到的部分数据放在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分区更灵活,可以放在硬盘的任何目录下,并且随时调整大小。基于这两种不同方式各自的优缺点,你可以根据实际情况选择使用哪种方式。

以下开始介绍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

3. 建立swap的文件系统:

mkswap /swapfile

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

  1. mkswap /dev/sdb

4. 建立swap的文件系统:

  1. swapon /swapfile

或者:

  1. swapon /dev/sdb

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

  1. /swapfile none swap defaults 0 0

或者:

  1. /dev/sdb none swap defaults 0 0

5. 如果你做了一个艰难的决定,要和之前的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

标签

评论

添加新评论

此字段内容将保密,不会被其他人看见。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
验证码
发布评论前,请通过下面的验证,以免被当作垃圾评论机器人屏蔽。
6 + 14 =
计算出这道简单的算术题并键入答案。例如、1+3,就输入 4。