Linux Swap 解读

来源:互联网 发布:python return语句用法 编辑:程序博客网 时间:2024/05/22 10:37

  大多数 Linux 在系统安装时都会提醒并建议你划分一个 Swap 交换分区,那么,Swap 交换分区是什么,到底有什么用呢?本文将介绍有关 Linux 中 Swap 的一些知识 ,让读者对 Swap 能有一个清晰的了解和掌握。


1.Swap概述

1.1.Swap的作用

  Swap全称为Swap place,即交换区。当用户提交程序,产生进程,在机器上运行,机器会判断当前物理内存是否还有空闲允许进程调入内存运行。如果有,那么直接调入内存运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到Swap中等待,然后把新的进程调入到内存中运行。从中可以看出Swap扮演了一个非常重要的角色,就是暂存被换出的进程。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。
  这里有一点必须强调,那就是,只有当那些被换出的进程需要运行时,才会从Swap重新加载到真实内存,否则它不会主动交换到真实内存中。这就可能导致这样一个问题:尽管有许多的空闲内存,却仍然有大量的交换空间正被使用。例如如果在某一时刻有进行交换的必要,但后来一个占用非常多物理内存的大进程结束并释放了内存,但是由于被交换出的数据并不会自动地交换进内存(除非有这个需要),故而此时物理内存会在一段时间内保持空闲状态,而交换区却依旧被占用。

1.2.Swap参数设置

  现在我们知道,在内存不够用的时候,系统会将部分内存上的数据交换到Swap中,以便让系统不会因内存不够用而导致OOM(Out Of Memory)或者更致命的情况出现。所以,当内存使用存在压力,开始触发内存回收的行为时,就可能会使用Swap空间。
  事实上,Linux可通过参数swappiness来控制何时使用Swap空间:


这里写图片描述

这个参数的取值区间为0-100,控制系统 Swap 的使用程度。0就是最大限度使用内存,尽量不使用Swap;100就是积极使用Swap。默认值为 60。注意:该参数只是一个权值,不是百分比值,具体含义涉及到系统内核复杂的算法,此处不赘述。
  有两种方式可以更改swappiness参数值,一种是临时性的修改,如下:

这里写图片描述

或者采用sysctl命令:

这里写图片描述

这里我们的修改已经生效,但是如果重启系统,该参数值又会变成60。
另一种是永久性的修改,在/etc/sysctl.conf 文件里添加如下参数:vm.swappiness=10。保存,重启,就生效了。

1.3.是否真的需要Swap

  从理论上讲,Swap 交换区增大了可以使用的内存空间,但事实并非如此。因为内存的数据交换速度是非常快的,而 Swap 交换区是把物理磁盘当成内存的载体,也就是说:虽然使用 Swap 可以让我们运行更多或更大的应用程序了,但物理磁盘的数据交换速度远比不上物理内存,因此也就可能造成运行性能的下降。而对硬盘特别是 SSD 磁盘的频繁读写,也会造成磁盘寿命的缩短和性能下降。不过,还有一点需要注意的是:Linux 系统休眠的数据是存储到 Swap 交换区中的,也就是说如果系统没有配置 Swap 交换区,在 Linux 上是无法进行休眠的。
  综上,总结一下使用Swap的优缺点如下:
优点:

  • 内存用完时,提供更多运行空间;
  • 可以休眠。

缺点:

  • 增加了磁盘的读写次数和损耗几率;
  • 不一定提高性能(1GB内存和5400转硬盘的Linux系统上网本,只需要多打开几个浏览器标签并多开几个应用就会造成内存占完而开始使用 Swap 交换区。由于硬盘只有5400转,随后便开始出现性能瓶颈。这是因为硬盘转速太慢,而又有大量的数据需要访问到 Swap 交换区,所以会造成机器越来越慢)。

  那么,配置 Swap 交换区究竟有无必要呢?答案是视情况而定,在此,我们给出以下几点建议:

1. 如果你需要 Linux 休眠功能,那么当然就需要 Swap 交换区;
2. 如果你的内存小于4GB,并且希望得到小的性能提升(至少7200转磁盘),可以配置一个Swap交换区;
3. 如果你的磁盘转速小于7200转,建议不要配置 Swap 交换区。
4. 不同负载状态的系统也应该区别对待:有时我们希望swap大一些,可以在内存不够用的时候不至于触发oom-killer导致某些关键进程被杀掉,比如数据库业务;也有时候我们希望不要swap,即使出现oom-killer也造成不了太大影响,但是不能允许服务器因为IO卡死进而像多米诺骨牌一样全部死机,因为当大量进程爆发增长导致内存爆掉之后,会因为swap导致IO跑死,整个系统都卡住,无法登录,无法处理。

2.管理Swap

2.1.查看系统当前Swap空间大小

  一般可采用free命令(Linux命令行——free命令详解):


这里写图片描述

其中,total是Swap空间总量,used是已使用大小,free是剩余大小。

  或者使用 swapon -s (等同于 cat /proc/swaps)命令:

这里写图片描述

其中,Filename是磁盘分区,Type是Swap交换区类型,这里是分区,其实也可以用文件作为交换区,后续我们会讲到,Size是Swap空间总量,Used是已使用大小,Priority是该交换区优先级。
  谈到交换区优先级,可以再多讲一些。在swapon的时候,我们可以使用-p参数指定相关swap空间的优先级,值越大优先级越高,可以指定的数字范围是-1到32767。内核在使用swap空间的时候总是先使用优先级高的空间,后使用优先级低的。当然如果把多个swap空间的优先级设置成一样的,那么两个swap空间将会以轮询方式并行进行使用。

2.2.Swap空间大小设置

  系统的Swap交换区大小设置多大才是最优呢? 在这里,我们提供一个简单的规则以供参考:

物理内存大小 Swap交换区大小 4G以内 2倍内存大小 4-8G 等于内存大小 8-64G 8G 64-256G 16G


事实上,系统中交换区的大小并非简单取决于物理内存的量,而是取决于系统中内存的负荷,所以在安装系统时最好根据具体的业务来设置Swap的值。

2.3.释放Swap空间

  假设系统出现了性能问题,我们通过vmstat命令(Linux命令行——vmstat命令详解)看到有大量的Swap,而物理内存又很充足,那么我们可以手动把Swap空间释放出来,让进程去使用物理内存,从而提高性能。释放Swap空间的步骤如下:

#先关闭相应的swap_disk_nameswapoff swap-disk_name#再启动相应的swap_disk_nameswapon swap-disk_name

2.4.Swap空间的删除

  swapoff 文件之后,删除掉对应的空间,再从/etc/fstab文件中删除对应的记录即可。

2.5.使用文件添加Swap交换区

  Swap交换区的数量对性能也有很大的影响。因为Swap毕竟还是以磁盘来伪装成内存,交换的操作是磁盘IO的操作而不是内存的load与store操作。如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。因此我们可以考虑为系统添加额外的Swap空间。
  Linux支持使用文件作为Swap,然后在线启用或者取消Swap。流程很简单,进入root后几步操作就可以搞定:

#首先你需要准备一个你想要的大小的文件,比如512MBdd if=/dev/zero of=/swapfile1 bs=1024 count=524288#然后,对这个文件格式化一下mkswap /swapfile1#启用swapswapon /swapfile1#如果我们需要让它每次开机自动挂载swap的话,我们需要编辑/etc/fstab,添加一行内容如下:/swapfile1 swap swap defaults 0 0#如果我们不想要这个swap,解除也很容易swapoff /swapfile1#然后删除/swapfile1这个文件即可rm -rf /swapfile1

  事实上,我们还可以使用磁盘分区添加Swap,或者调整已有Swap磁盘分区的大小,关于这些,读者可自行了解,本文不细述。


参考文献

[1] http://blog.csdn.net/zwan0518/article/details/12059213
[2] http://www.linuxidc.com/Linux/2014-05/102272.htm
[3] http://www.linuxidc.com/Linux/2013-05/84252.htm
[4] http://www.cnblogs.com/kerrycode/p/5246383.html
[5] http://blog.csdn.net/wh8_2011/article/details/51798407
[6] http://blog.csdn.net/qq_25189001/article/details/51325152
[7] http://www.t086.com/article/5105
[8] http://blog.csdn.net/tianlesoftware/article/details/8741873
[9] http://commandos.blog.51cto.com/154976/115288
[10] https://blog.argcv.com/articles/3248.c
[11] https://zh.wikipedia.org/wiki/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98
以上为本文的全部参考文献,对原作者表示感谢。

原创粉丝点击