为什么要使用Swap?

Linux Swap现在已经耳熟能详了,在过去的几十年中几乎所有的系统都使用了Linux Swap,而人们对它却知之甚少,尤其是对线上生产环境的影响。

简单来说,Swap就是内存溢出。本质上是服务器物理内存的扩展。由于是在磁盘上,所以即使使用了SSD,Swap也要比内存慢得多。

那我们还要不要Swap? 

理论上讲,如果我们拥有足够的物理内存,我们就不需要任何Swap。其实,AWS和其它云平台通常默认是没有Swap的。但问题是,由于成本考虑,我们的内存通常并不充裕,尤其是在云平台上。

因此,在大多数情况下,我们还是需要Swap的。为什么呢?即使是在大内存的系统,尤其是在一个繁忙活跃的系统中,如果存在内存泄漏或者内存突然激增等问题,耗尽内存也是轻而易举的事。如果没有Swap或者足够的内存,进程可能会被中止,从而引发严重后果。

另外,诸如一些基于NUMA(非一致性内存访问)CPU架构的系统,抑或是Redis使用中产生的内存超用的问题。这些都是更为高级的话题。

我们需要多大的Swap? 

这取决于服务器本身和所运行的服务。旧的标准是内存的2倍,所以4GB的服务器可能会有8GB的Swap。现在一般是一倍于内存即可,一般为2GB到16GB起。这样就在磁盘消耗和系统内存安全之间取了个不错的折衷。

Swap文件和分区 

那么问题来了,要把Swap放在哪里呢。一般来说,它会被配置在一个swap分区,通过类似fdisk的工具可以看到有swap自己的单独的分区类型。目前这仍是主流配置方式,然而目前可以看的是两者性能相当情况下,swap文件方式正变得更普遍,也更灵活且易于调整和转移。

何时发生SWAP(优先级)?

内核交换优先级对于大家来说都是复杂而又神秘的。以至于某些交换问题(如NUMA)大家仅仅只是道听途说。一般情况下,最少使用的内容将被交换出去,尽管最少使用这一说法通常并不明确。有一些脚本可以帮助你来了解什么被交换出内存,以便于你来分析中止哪些服务/程序可以恢复Swap。

更大的问题是什么时候发生内核交换。一般规则是,当实际内存用完时,就会发生。但是实际上要复杂得多,首先因为swappiness这一内核参数(有blog描述此参数)。所有服务器的swappiness值应当设置为1,在低内存使用率时平衡程序和文件缓存RAM。换句话说,当RAM不足时,内核应当先删除文件缓存还是先进行交换。当服务器Swap出现问题时,服务器一般选择先删除文件缓存,因为Swap不是啥好事。

 在交换时会发生什么? 

对于那些自身内存空间已经被交换出去的进程来说,swap对其是有影响的。事实上,对于MySQL、MongoDB等大型应用来说,交换过程可能是灾难性的,因为任何在交换过程中的程序都是出于冻结状态的。在某些系统中,冻结过程可能要 1分钟或更久,这对于DB来说是很久的时间。

 为什么Swap对于服务器有害? 

因为交换中的服务和程序处于冻结状态,这对服务器影响是很坏的。因为相关的数据库、网络服务器和Java应用服务器等都会被冻结,并且通常至少要冻结数秒甚至数分钟(至少在SATA硬盘上是如此),这对用户来说真不是啥好事。

 为什么我的交换没有启用?

如果你有足够的内存空间的话,系统不会进行交换。如果你将swappiness设置为较低的值,比如1,(新内核请不要设置为0),除非在万不得已的情况下,您的系统是不会进行内存交换的。

Swap的优缺点

Swap的优点是,系统在内存不足时仍可以继续运行,尽管速度会慢很多。内核可以将很少使用或者不需要的内存存储空间转移到Swap,从而释放更多的内存。

缺点是交换很慢,并且需要冻结相关的服务,尤其对于MySQL等多线程服务来说影响非常严重。

可以手动将交换分区的内容转移回内存吗?

是的,只需要关闭Swap就可以让内核强制将Swap中的数据发回内存(前提是有足够的内存)。这么做会重置SWAP,然后再次开启Swap即可。

 总结 

在被偶尔触发的情况下,swap还是很受用的。它在系统内存不足或者内存激增时可以帮助系统保持运行状态。过于频繁的使用则会导致严重问题,况且Swap也会有被用完的时候。


Tags: File systems, Linux
Categories: Linux

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

* Copy This Password *

* Type Or Paste Password Here *