对swap交换分区虚拟内存的理解

目录

一、什么是swap?

二、为什么需要swap?

三、swap的缺点?

 四、Swap分区的作用

1、扩展内存

2、防止意外崩溃

3、将经常不使用的内存数据转移至Swap分区中

五、到底要不要swap?

1、内存勉强够用

2、内存充裕

3、服务器环境

六、怎么配置swap?

七、查看系统中已经配置的swap

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

九、如何优化swap性能?


一、什么是swap?

        每次安装Linux的时候,都会要求配置交换分区,那么这个分区是干嘛的呢?不设置这个分区有什么后果?如果一定要设置,设置多大比较合适?

对swap交换分区虚拟内存的理解_第1张图片

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

        Swap分区的大小是与内存大小相关的,通常建议Swap分区的大小为内存的2倍,但也不是绝对的。Swap分区还可以使用交换文件来代替,在需要增加Swap分区时非常方便。

二、为什么需要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分区的作用

1、扩展内存

        当内存使用量过大时,Swap分区将会暂时代替内存,从而减轻内存的使用压力。在大部分情况下,Swap分区的作用并不明显。但是在一些需要大量内存的任务或者虚拟机使用时,Swap分区扩展内存是解决问题的重要手段。

2、防止意外崩溃

        当内存不足时,操作系统往往会强制终止一些程序,以保证操作系统的运行。然而,当正在运行的程序需要持久性存储数据时,会造成数据丢失等问题。使用Swap分区的方式可以很好的解决该问题。当内存不足时,操作系统会将数据写入Swap分区中,并在内存足够时再读取数据。        

3、将经常不使用的内存数据转移至Swap分区中

        Swap分区不仅可以用来扩充内存,同时也可以用来辅助操作系统更高效地运行。例如,一些经常不使用的内存数据可以转移到Swap分区中,以释放内存空间,使操作系统运行更加稳定。

五、到底要不要swap?

1、内存勉强够用

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

2、内存充裕

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

3、服务器环境

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

  • 配置了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空间。

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

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

七、查看系统中已经配置的swap

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

如果配置有多个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的频率

[root@hdp101 ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 298276  25788 21850032    0    0     9     9    5    5  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0    14   67   55  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   47   51  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   39   37  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   51   56  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   44   42  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   36   43  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   38   37  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   79   72  0  0 100  0  0
 0  0      0 298344  25796 21850032    0    0     0     0   51   47  0  0 100  0  0
 0  0      0 298376  25796 21850032    0    0     0     0   36   43  0  0 100  0  0
 0  0      0 298468  25796 21850032    0    0     0     0   50   47  0  0 100  0  0
 0  0      0 298476  25796 21850032    0    0     0     0   38   44  0  0 100  0  0
 0  0      0 298508  25796 21850032    0    0     0     0   33   35  0  0 100  0  0

九、如何优化swap性能?

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

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

你可能感兴趣的:(Linux,linux,运维,服务器)