Linux Swap交换分区

发布于 2019-08-12  14 次阅读


[infobox title="Linux Swap分区交换概念"]

Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

[/infobox]

[infobox title="Swap相关操作"]

启用Swap

1.添加交换文件:

bs为交换文件大小,count为交换文件数量。如果添加1GB的交换分区文件则输入以下命令

sudo dd if=/dev/zero of=swapfile bs=1M count=1024

2.将创建的交换文件格式化为swap

mkswap swapfile

3.启用

swapon swapfile

添加交换分区

如果创建交换文件,请跳过此步骤。

但是如果你有空间使用fdisk来添加新的交换空间。

fdisk /dev/sda

现在按下n,按下回车键,如果第一个扇区没问题(通常都可以)。

使用以下格式设置新分区:X是驱动器的字母,Y是分区的编号。

mkswap /dev/sdXY

警告:以下步骤可能会破坏您的设置!

将分区添加到 /etc/fstab。 用vim或nano打开它,并添加:

/dev/sdXY swap swap defaults 0 0

检查哪个硬盘驱动器有空间来添加交换分区。

df -h

4.检查Swap是否启动

sudo swapon -s

5.永久启动Swap

如果想要让创建好的Swap分区或文件永久启动,可以将swapfile路径内容写入到 /etc/fstab 文件中

vim /etc/fstab

6.写入

/swapfile swap swap defaults 0 0

7.wq保存

调整Swappiness值

Swappiness 是一个 Linux 内核属性,用于定义 Linux 系统使用 SWAP 空间的频率。Swappiness 值可以从0至100,较低的值会让内核尽可能少的使用 SWAP 空间,而较高的值将让 Linux Kernel 能够更加积极地使用 SWAP 分区。

Ubuntu 19.10 默认的Swappiness值为60。可使用以下命令查看

cat /proc/sys/vm/swappiness

要改变Swappiness值可使用以下命令

sudo sysctl vm.swappiness=35

要永久改变Swappiness值可编辑sysctl.conf文件

sudo vim /etc/sysctl.conf

在这个conf文件中加入以下代码

vm.swappiness=35

移除Swap分区或文件

停用Swap空间

sudo swapoff -v swapfile

在 /etc/fstab 文件中删除有效的Swap行

删除Swap文件

sudo rm swapfile

[/infobox]

[infobox title="Swap分区空间什么时候使用"]

系统在什么情况或条件下才会使用Swap分区的空间呢? 其实是Linux通过一个参数swappiness来控制的。当然还涉及到复杂的算法。
这个参数值可为 0-100,控制系统 swap 的使用程度。高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值为 60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。

[/infobox]

[infobox title="Swap交换分区对性能的影响"]

我们知道Linux可以使用文件系统中的一个常规文件或独立分区作为Swap交换空间,相对而言,交换分区要快一些。但是和RAM比较而言,Swap交换分区的性能依然比不上物理内存,目前的服务器上RAM基本上都相当充足,那么是否可以考虑抛弃Swap交换分区,是否不需要保留Swap交换分区呢?这个其实是我的疑问之一。在这篇What Is a Linux SWAP Partition, And What Does It Do?博客中,作者给出了swap交换空间的优劣

Advantages:

  1. Provides overflow space when your memory fills up completely
  2. Can move rarely-needed items away from your high-speed memory
  3. Allows you to hibernate

Disadvantages:

  1. Takes up space on your hard drive as SWAP partitions do not resize dynamically
  2. Can increase wear and tear to your hard drive
  3. Does not necessarily improve performance (see below)

其实保留swap分区概括起来可以从下面来看:

首先,当物理内存不足以支撑系统和应用程序(进程)的运作时,这个Swap交换分区可以用作临时存放使用率不高的内存分页,把腾出的内存交给急需的应用程序(进程)使用。有点类似机房的UPS系统,虽然正常情况下不需要使用,但是异常情况下, Swap交换分区还是会发挥其关键作用。

其次,即使你的服务器拥有足够多的物理内存,也有一些程序会在它们初始化时残留的极少再用到的内存分页内容转移到 swap 空间,以此让出物理内存空间。对于有发生内存泄漏几率的应用程序(进程),Swap交换分区更是重要,因为谁也不想看到由于物理内存不足导致系统崩溃。

最后,现在很多个人用户在使用Linux,有些甚至是PC的虚拟机上跑Linux系统,此时可能常用到休眠(Hibernate),这种情况下也是推荐划分Swap交换分区的。

其实少量使用Swap交换空间是不会影响性能,只有当RAM资源出现瓶颈或者内存泄露,进程异常时导致频繁、大量使用交换分区才会导致严重性能问题。另外使用Swap交换分区频繁,还会引起kswapd0进程(虚拟内存管理中, 负责换页的)耗用大量CPU资源,导致CPU飙升。

[/infobox]

参考文档:

https://wiki.archlinux.org/index.php/swap

https://www.cnblogs.com/kerrycode/p/5246383.html

https://www.sysgeek.cn/ubuntu-18-04-swap/