下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过

什么是swap?

swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。

为什么需要swap?

要回答这个问题,就需要回答swap给我们带来了哪些好处。

  • 对于一些大型的应用程序(如LibreOffice、video editor等),在启动的过程中会使用大量的内存,但这些内存很多时候只是在启动的时候用一下,后面的运行过程中很少再用到这些内存。有了swap后,系统就可以将这部分不这么使用的内存数据保存到swap上去,从而释放出更多的物理内存供系统使用。
  • 很多发行版(如ubuntu)的休眠功能依赖于swap分区,当系统休眠的时候,会将内存中的数据保存到swap分区上,等下次系统启动的时候,再将数据加载到内存中,这样可以加快系统的启动速度,所以如果要使用休眠的功能,必须要配置swap分区,并且大小一定要大于等于物理内存
  • 在某些情况下,物理内存有限,但又想运行耗内存的程序怎么办?这时可以通过配置足够的swap空间来达到目标,虽然慢一点,但至少可以运行。
  • 虽然大部分情况下,物理内存都是够用的,但是总有一些意想不到的状况,比如某个进程需要的内存超过了预期,或者有进程存在内存泄漏等,当内存不够的时候,就会触发内核的OOM killer,根据OOM killer的配置,某些进程会被kill掉或者系统直接重启(默认情况是优先kill耗内存最多的那个进程),不过有了swap后,可以拿swap当内存用,虽然速度慢了点,但至少给了我们一个去debug、kill进程或者保存当前工作进度的机会。
  • 如果看过Linux内存管理,就会知道系统会尽可能多的将空闲内存用于cache,以加快系统的I/O速度,所以如果能将不怎么常用的内存数据移动到swap上,就会有更多的物理内存用于cache,从而提高系统整体性能。

swap的缺点?

上面介绍了swap的优点,那swap的缺点呢?swap是存放在磁盘上的,磁盘的速度和内存比较起来慢了好几个数量级,如果不停的读写swap,那么对系统的性能肯定有影响,尤其是当系统内存很吃紧的时候,读写swap空间发生的频率会很高,导致系统运行很慢,像死了一样,这个时候添加物理内存是唯一的解决办法。

由于系统会自动将不常用的内存数据移到swap上,对桌面程序来说,有可能会导致最小化一个程序后,再打开时小卡一下,因为需要将swap上的数据重新加载到内存中来。

到底要不要swap?

上面介绍了什么是swap以及它们的优缺点,那么到底要不要配置swap呢?答案是:看情况。

下面分别讨论内存不够用、内存勉强够用和内存很充裕这三种情况下服务器和桌面环境对swap的选择。

内存不够用

不管是桌面还是服务器,当物理内存明显不够用,而又想跑程序的话,添加swap是唯一的选择,慢点总比不能工作强。

内存勉强够用

建议配置swap,这样内核会将不常用的数据从内存移到swap上,从而有更多的物理内存供系统调用,提升系统性能,同时也避免因偶尔的物理内存不够造成进程异常退出,提升系统稳定性,但对服务器来说,一定要限制或者监控swap空间的使用情况,当出现swap空间使用超预期或者swap in/out频繁时,要及时采取措施,不然对性能影响很大

内存充裕

理论上来说,如果物理内存足够多并且不需要休眠功能,那swap就没什么用,可关键问题是我们很难保证物理内存在任何情况下都够用,因为总有意想不到的情况发生,比如某些进程耗内存超预期,服务器压力超预期,内存泄漏等。

在内存充裕的这种情况下,如果发生异常,swap能帮到我们吗?

桌面环境

一般不会开什么监控功能,所以也没法提前预知内存使用异常,当内存被用光的时候,分两种情况:

  • 配置了swap:在系统变慢的时候能感觉到,可能还有机会杀掉一些进程和保存当前工作进度,当然也会出现慢的想砸电脑的情况,不过在磁盘如此廉价的情况下,浪费点磁盘空间换取这样的一个机会还是值得的。
  • 没有配置swap:内核的OOM killer被触发,可能连保存工作进度的机会都没有。

服务器环境

服务器一般都会配置监控程序,当内存用量达到一个阈值的时候告警或者会自动重启异常的进程。但如果没有监控呢?当内存被用光的时候,分两种情况:

  • 配置了swap:这时服务器还能提供服务,但性能会降低好几个档次,直到最终处于几乎死机状态,并且这一过程将持续很长一段时间,对服务器来说是个灾难;所以配置swap只能让服务再苟延残喘一会儿,然后就是长时间的服务中断(比如原来是每秒处理1000个请求的服务器,由于频繁使用swap,导致现在每秒只能处理50个请求,站在系统角度,进程还在运行,但是在业务角度服务已经几乎中断了)。
  • 没配置swap:这时内核的OOM killer被触发,在默认配置下,耗内存的进程会被优先kill掉,这种进程一般就是我们的业务进程,这时守护进程就会自动重启该业务进程(没有守护进程?开什么玩笑),这种情况只会造成服务中断一会会儿(取决于进程重启的时间),不会出现上面因配置了swap而导致性能很差且服务持续中断的情况。就算OOM killer没有kill掉预期的进程,我们通过测试也能发现,然后将OOM killer配置成重启系统,那也比配置了swap在那里苟延残喘的好。

从上面可以看出,对服务器来说,似乎不配置swap更好,可以让有问题的进程尽快重启,缩短业务受影响的时间。

并且,就算没有配置监控程序,我们还有cgroups中的内存控制模块,可以控制一组进程所能使用的最大内存数,当超过这个数的时候,可以触发相应的行为,比如重启进程等。

总的来说,对于桌面环境来说,一般内存没有服务器端那么充裕,并且由于使用场景原因,会打开很多不同类型的GUI窗口,但前台的进程只有一个,大部分都是在后台待命,所以配置swap对提升性能还是有必要的;对于服务器来说,配置的内存都比较充裕,启动起来的进程也都是要干活的进程(不然就不应该被启动起来),并且也没有休眠的需求,再加上有了cgroups之后,可以更轻松的限制进程的内存使用,个人认为配置swap基本没什么必要了,看看coreos,默认就没有swap。

swap大小配置多少比较合适?

既然配置swap对桌面系统有帮助,那么配置多少大小的swap比较合适呢?下面是ubuntu给出的建议:

  • 当物理内存小于1G且不需要休眠时,设置和内存同样大小的swap空间即可;当需要休眠时,建议配置两倍物理内存的大小,但最大值不要超过两倍内存大小
  • 当物理内存大于1G且不需要休眠时,建议大小为round(sqrt(RAM)),其中RAM为物理内存大小;当需要休眠时,建议大小是RAM+round(sqrt(RAM)),但最大值不要超过两倍内存大小
  • 如果两倍物理内存大小的swap空间还不够用,建议增加内存而不是增加swap

下面是详细的不同物理内存情况下的建议,第一列是物理内存的大小,第二列和第三列是不需要和需要休眠两种情况下推荐的大小,第四列是不要超过的最大值

 物理内存(MB)  不需要休眠  需要休眠  最大值
256 256 512 512
512 512 1024 1024
1024 1024 2048 2048 物理内存(GB) 不需要休眠 需要休眠 最大值
1 1 2 2
2 1 3 4
3 2 5 6
4 2 6 8
5 2 7 10
6 2 8 12
8 3 11 16
12 3 15 24
16 4 20 32
24 5 29 48
32 6 38 64
64 8 72 128
128 11 139 256 

怎么配置swap?

当我们确定好配置多大的swap空间后,具体应该怎么配置呢?当然可以在系统安装的时候分配好,但如果对安装时分配的大小不满意,我们还可以在后面进行调整。在这里将不介绍安装的时候怎么配,只介绍如何往系统中添加更多的swap空间。

Linux下有两种类型的swap空间,swap分区和swap文件,他们有各自的特点:

  • swap分区上面由于没有文件系统,所以相当于内核直接访问连续的磁盘空间,效率相对要高点,但由于swap分区一般安装系统时就分配好了了,后期要缩减空间和扩容都很不方便。
  • swap文件放在指定分区的文件系统里面,所以有可能受文件系统性能的影响,但据说2.6版本以后的内核可以直接访问swap文件对应的物理磁盘地址,相当于跳过了文件系统直接访问磁盘,不过如果swap文件在磁盘上的物理位置不连续时,还是会对性能产生不利影响,但其优点就是灵活,随时可以增加和移除swap文件。

查看系统中已经配置的swap

使用命令swapon -s即可查看系统中在用的swap


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

如果配置有多个swap分区或者文件的话,这里将会有多行,每行代表一个正在被系统使用的swap分区或文件,下面是每个字段的意思:

  • Filename:如果swap类型是分区,这里将是分区的路径,如果swap类型是文件,这里将是文件的路径
  • Type:swap的类型,partition代表这是一个swap分区,file代表这是一个swap文件
  • Size:swap的大小,单位是k,这里524284表示的差不多是512M
  • Used:已经被使用的大小,这里0表示还没有被使用到
  • Priority:优先级,优先级高的swap将会被优先使用,同等优先级的swap将会被均匀的使用(round-robin算法),优先级可以通过“swapon -p”命令来设置

查看系统中swap in/out的情况

并不是swap空间占用多就一定性能下降,真正影响性能是swap in和out的频率,频率越高,对系统的性能影响越大,我们可以通过vmstat命令来查看swap in/out的频率

#参数2表示每两秒统计一次,si和so两列就是每秒swap in和out的次数


  1. #参数2表示每两秒统计一次,si和so两列就是每秒swap in和out的次数
  2. dev@ubuntu:~$ vmstat 2
  3. procs------------memory--------------swap----io-----system-----------cpu-----
  4. r b    swpd  free  buff cache      si so   bi bo   in  cs      us sy id wa st
  5. 0 0    70232 75620 7940 209476     0  0    0  0    111 180     0  1  99 0  0
  6. 0 0    70232 75620 7940 209476     0  0    0  0    116 186     1  1  99 0  0
  7. 0 0    70228 75620 7940 209476     2  0    2  0    120 193     1  1  98 1  0
  8. 0 0    70228 75620 7940 209476     0  0    0  0    117 186     0  0  100 0 0
  9. 0 0    70228 75620 7940 209476     0  0    0  0    113 184     0  1  99 0  0

添加swap分区

在添加swap分区前,首先得有一个空闲的分区,如果是一块新的磁盘,可以用fdisk来创建一个新的分区用于swap。

注意:磁盘分区操作一定要小心,弄不好就会造成数据丢失、系统挂掉的后果。磁盘分区操作不是本篇要介绍的内容,所以这里不会讨论fdisk怎么用。


  1. #本篇使用的测试环境是虚拟机,/dev/sdb是一块新加的硬盘并且已经用fdisk创建好了一个分区
  2. #本例中将使用/dev/sdb1这个分区
  3. dev@dev:~$ sudo fdisk -l /dev/sdb
  4. Device     Boot Start     End Sectors Size Id Type
  5. /dev/sdb1        2048 4194303 4192256   2G 83 Linux
  6. #创建swap分区
  7. dev@dev:~$ sudo mkswap /dev/sdb1
  8. Setting up swapspace version 1, size = 2 GiB (2146430976 bytes)
  9. no label, UUID=d69621de-618a-4bea-9a96-b8e8b0d0ea40
  10. #查看系统中现在正在使用的swap,以便于和添加后做比较
  11. dev@dev:~$ swapon -s
  12. Filename                Type        Size    Used    Priority
  13. /dev/dm-1                               partition   524284  0   -1
  14. #将新的分区加入到系统中
  15. dev@dev:~$ sudo swapon /dev/sdb1
  16. #这时候可以看到新的swap分区已经被加入到系统中了,并且优先级比原来的要低
  17. dev@dev:~$ swapon -s
  18. Filename                Type        Size    Used    Priority
  19. /dev/dm-1               partition   524284  0       -1
  20. /dev/sdb1               partition   2096124 0       -2
  21. #为了保证系统重启后会自动加载我们新的swap分区,需要修改/etc/fstab文件
  22. dev@dev:~$ sudo sh -c 'echo "/dev/sdb1 none  swap    sw   0    0" >> /etc/fstab'
  23. #查看一下,确保写入成功,这里的第一条是原来的系统的swap分区,第二条是我们刚添加的
  24. dev@dev:~$ grep swap /etc/fstab
  25. /dev/mapper/dev--vg-swap_1 none            swap    sw              0       0
  26. /dev/sdb1 none  swap    sw   0    0

添加swap文件

添加swap文件就简单多了,也没有分区操作那么有风险。


  1. #先创建一个新的512M的文件,用来作为swap文件,文件路径可以随便
  2. #fallocate这个命令依赖于文件系统,有些老的文件系统不支持这个命令,比如ext2,
  3. #这种情况下可以用dd来实现同样的效果:
  4. #sudo dd if=/dev/zero of=/mnt/512MiB.swap bs=1024 count=524288
  5. #fallocate和dd的区别在于:
  6. #fallocate是先声明这么多,然后在具体用到的时候文件系统才分配真正的物理磁盘空间,就是用一点分配一点,
  7. #而dd是一开始就实实在在的写了512m的数据到物理磁盘空间。
  8. #所以作为测试来说fallocate方便些,因为刚开始不用写任何数据,要快
  9. dev@dev:~$ sudo fallocate -l 512m /mnt/512MiB.swap
  10. #修改文件的权限,避免其他用户对这个文件进行误操作
  11. dev@dev:~$ sudo chmod 600 /mnt/512MiB.swap
  12. #格式化为swap文件
  13. dev@dev:~$ sudo mkswap /mnt/512MiB.swap
  14. #将新的文件加入到系统中
  15. dev@dev:~$ sudo swapon /mnt/512MiB.swap
  16. #这时候可以看到新的swap文件已经被加入到系统中了,类型为file
  17. #这里可以看到由于优先级最高,第一个swap分区/dev/dm-1已经被使用了24K
  18. dev@dev:~$ swapon -s
  19. Filename                Type        Size    Used    Priority
  20. /dev/dm-1               partition   524284  24      -1
  21. /dev/sdb1               partition   2096124 0       -2
  22. /mnt/512MiB.swap        file        524284  0       -3
  23. #从free命令的输出可以看到,经过前面两轮添加swap分区和文件,
  24. #现在系统的交换空间已经变成3G(3144692K)了
  25. dev@dev:~$ free
  26. total        used        free      shared  buff/cache   available
  27. Mem:         500192       39112        9564        1996      451516      430820
  28. Swap:       3144692          24     3144668
  29. #同样为了保证系统重启后会自动加载我们新的swap文件,需要修改/etc/fstab文件
  30. dev@dev:~$ sudo sh -c 'echo "/mnt/512MiB.swap none  swap    sw   0    0" >> /etc/fstab'

注意:不是所有的文件系统都支持创建swap文件,如btrfs,在btrfs分区里创建swap文件将失败。

取消所有的swap

如果经过深思熟虑之后,确定不再需要swap,那么可以将所有的swap分区和文件从系统中移除,步骤和上面的刚好相反


  1. #停掉所有系统正在使用的swap
  2. dev@dev:~$ sudo swapoff -a
  3. #swapon -s命令没有任何输出,free命令显示swap空间为0,说明swapoff成功
  4. dev@dev:~$ swapon -s
  5. dev@dev:~$ free
  6. total        used        free      shared  buff/cache   available
  7. Mem:         500192       35924      348888        2004      115380      433924
  8. Swap:             0           0           0
  9. #当然我们还需要修改/etc/fstab,否则下次重启后,系统又会重新挂载相应的swap分区和文件
  10. #使用自己喜欢的编辑器,将/etc/fstab中跟swap相关的三行删掉即可(本例中是三行,请根据实际情况调整)

如何优化swap性能?

怎么配置swap可以让它的性能更好呢?

  • 尽量使用swap分区,相对于swap文件来说,分区肯定是连续的物理磁盘空间,而swap文件有可能不是
  • 将swap分区和系统所在的分区放在不同的磁盘上,这样就不会和系统盘抢同一个磁盘的I/O带宽
  • 如果有多块磁盘的话,可以在每个盘上创建一个swap分区,并且将它们的优先级设置的一样,这样内核就会平均的访问这些swap分区,性能相当于原来的N倍(这里N是磁盘的数量)

不过话又说回来了,如果频繁的访问swap的话,怎么优化swap都没用,跟内存比还是低几个数量级,性能还是下降的厉害,如果不频繁访问swap的话,优化swap又有啥意义呢?所以其实优化swap性能的实际意义不大,这里了解一下就好。

配置swappiness

有时我们桌面环境确实配置了比较充裕的内存,并且也配置了swap空间,这个时候就希望尽量减少swap空间的使用,避免对系统性能造成影响,Linux早就帮我们考虑到这种情况了,在2.6内核中,增加了一个叫做swappiness的参数,用于配置需要将内存中不常用的数据移到swap中去的紧迫程度。这个参数的取值范围是0~100,0告诉内核尽可能的不要将内存数据移到swap中,也即只有在迫不得已的情况下才这么做,而100告诉内核只要有可能,尽量的将内存中不常访问的数据移到swap中。

Ubuntu的desktop和server的默认配置都是60(可能会随着版本变化),对于桌面环境来说,界面的响应速度直接关系到系统的流畅程度,如果内存比较充裕的话,可以将这个值设置的小一点,这样就尽可能的把数据留在内存中,从而唤醒后台界面程序会更快一些,Ubuntu desktop建议将该值设置为10,当然大家可以根据swap空间的实际使用情况,任意调整这个参数,直到自己满意的水平为止。对于服务器来说,主要性能衡量标准是整体的处理能力,而不是具体某一次的响应速度,能把更多的内存用来做I/O cache可能效果更好,所以Ubuntu server建议保持60的默认值。

  • 查看当前系统中swappiness的值

  1. dev@dev:~$ cat /proc/sys/vm/swappiness
  2. 60
  • 修改当前系统中swappiness的值

  1. dev@dev:~$ sudo sysctl vm.swappiness=10
  2. vm.swappiness = 10
  3. dev@dev:~$ cat /proc/sys/vm/swappiness
  4. 10

上面通过sysctl修改的swappiness值在系统重启后会失效,要想重启后继续生效,需要修改配置文件/etc/sysctl.conf,将下面这行修改成10,如果文件中找不到这行的话,在文件末位加上这行就可以了


  1. vm.swappiness=10
 
 
 
 
作者:wuyangchun
来源:51CTO

Linux交换空间(swap space)的那些优缺点的更多相关文章

  1. iOS中的交换空间(swap space)

    看来是没有交换空间,原因是闪存和SSD硬盘相比,速度很慢,也有电源管理的原因. the NAND flash is not designed to be used as swap. It is dam ...

  2. Linux交换空间和内存不足

    交换空间 交换技术就是将一页内存复制到预先设定的硬盘上的交换空间,来释放该页占用内存.物理内存和交换空间的和就是可提供的虚拟内存的总量.Linux有两种形式的交换方式,分别是交换分区,交换文件. 优点 ...

  3. Linux 交换分区swap

    Linux 交换分区swap 一.创建和启用swap交换区 如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存 ...

  4. 如何增加Ubuntu交换空间swap

    如何增加Ubuntu交换空间swap 1  使用命令查看系统内swap分区大小 green@green:~$ free -m total used free shared buff/cache ava ...

  5. Linux交换空间(swap space)

    每次安装Linux的时候,都会要求配置交换分区,那么这个分区是干嘛的呢?不设置这个分区有什么后果?如果一定要设置,设置多大比较合适?本篇将试图回答这些问题并尽量覆盖所有swap相关的知识. 下面的所有 ...

  6. 安装Ubuntu时,遇到自定义交换空间swap大小设置问题

    【整理】Ubuntu自定义分区设置 在安装Ubuntu时,如果使用的是一个新硬盘那么安装向导会建议你使用整个硬盘,如果硬盘上已经有数据了,向导会建议使用剩余的空间。不管怎样,是由向导自动划分的分区。 ...

  7. linux交换空间

    swap空间有两种形式:一是交换分区,二是交换文件.总之对它的读写都是磁盘操作. linux内存通过 virtual memory 虚拟内存来管理整个内存, 虚拟内存管理着物理内存,也管理着swap交 ...

  8. Linux交换分区swap

    一.SWAP 说明 1.1 SWAP 概述 当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被 ...

  9. linux 交换分区 swap

    linux swap分区用来保证内存过载时也可以使用,是在磁盘级别对内存的一次扩展,swap分区必须是一个单独的分区 创建过程: 1.用fdisk 命令新建分区,在创建过程中通过L命令和t命令来调整分 ...

随机推荐

  1. asp.net 页面按回车就会触发button按钮事件

    转载于 https://www.cnblogs.com/anz130/articles/2445830.html 转自:http://space.itpub.net/12639172/viewspac ...

  2. Linux系统硬链接和软链接说明 - 运维笔记

    在linux系统中有种文件是链接文件,可以用来解决文件的共享使用.链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link).先来查看下 ...

  3. vue---父调子 $refs (把父组件的数据传给子组件)

    ps:App.vue 父组件 Hello.vue 子组件  App.vue  : <template> <div id="app"> <input t ...

  4. k8s的Pod状态和生命周期管理

    Pod状态和生命周期管理   一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod p ...

  5. 【转】SENDING KEY VALUE MESSAGES WITH THE KAFKA CONSOLE PRODUCER

    SENDING KEY VALUE MESSAGES WITH THE KAFKA CONSOLE PRODUCER When working with Kafka you might find yo ...

  6. js 面向对象之构造器与工厂函数

    字面量模式声明一个对象实例 let m = {name: "lisi", age:15} m.constructor // ƒ Object() { [native code] } ...

  7. springboot项目对接支付宝支付

    支付宝对接文档 一.准备工作 1. 首先要到 蚂蚁金服开发者中心 https://openhome.alipay.com/platform/home.htm 注册商家账户,并认证. 2.下载java版 ...

  8. [CSS] Change the off-axis Alignment of a Flexed Container with `align-items`

    We changed the axis layout with 'justify-content', and the "off axis" layout is controlled ...

  9. 011_GoldWave软件安装及使用

    (一)软件安装包: 链接:https://pan.baidu.com/s/15c5veooyA8bAYIAgLFOLjg提取码:jiis 复制这段内容后打开百度网盘手机App,操作更方便哦 (二)降低 ...

  10. kalilinux MSF数据库的连接

    需要自动连接数据库.如下设置.