Linux swap分区

Linux swap分区教程

Linux 中的 swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。

简单点说,当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是我们常说的 swap out 和 swap in。

Linux swap分区详解

为什么需要swap

对于一些大型的应用程序(如 LibreOffice、video editor 等),在启动的过程中会使用大量的内存,但这些内存很多时候只是在启动的时候用一下,后面的运行过程中很少再用到这些内存。有了 swap 后,系统就可以将这部分不这么使用的内存数据保存到 swap 上去,从而释放出更多的物理内存供系统使用。

很多发行版(如 ubuntu)的休眠功能依赖于 swap 分区,当系统休眠的时候,会将内存中的数据保存到 swap 分区上,等下次系统启动的时候,再将数据加载到内存中,这样可以加快系统的启动速度,所以如果要使用休眠的功能,必须要配置 swap 分区,并且大小一定要大于等于物理内存。

在某些情况下,物理内存有限,但又想运行耗内存的程序怎么办?这时可以通过配置足够的 swap 空间来达到目标,虽然慢一点,但至少可以运行。

虽然大部分情况下,物理内存都是够用的,但是总有一些意想不到的状况,比如某个进程需要的内存超过了预期,或者有进程存在内存泄漏等,当内存不够的时候,就会触发内核的 OOM killer,根据 OOM killer 的配置,某些进程会被 kill 掉或者系统直接重启(默认情况是优先 kill 耗内存最多的那个进程),不过有了 swap 后,可以拿 swap 当内存用,虽然速度慢了点,但至少给了我们一个去 debug、kill 进程或者保存当前工作进度的机会。

系统会尽可能多的将空闲内存用于 cache,以加快系统的 I/O 速度,所以如果能将不怎么常用的内存数据移动到 swap 上,就会有更多的物理内存用于 cache,从而提高系统整体性能。

swap缺点

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

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

swap大小配置

当物理内存小于 1G 且不需要休眠时,设置和内存同样大小的 swap 空间即可;当需要休眠时,建议配置两倍物理内存的大小,但最大值不要超过两倍内存大小。

当物理内存大于 1G 且不需要休眠时,建议大小为 round(sqrt(RAM)),其中 RAM 为物理内存大小;当需要休眠时,建议大小是 RAM+round(sqrt(RAM)),但最大值不要超过两倍内存大小。

如果两倍物理内存大小的 swap 空间还不够用,建议增加内存而不是增加 swap。

怎么配置swap

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

swap 分区上面由于没有文件系统,所以相当于内核直接访问连续的磁盘空间,效率相对要高点,但由于 swap 分区一般安装系统时就分配好了了,后期要缩减空间和扩容都很不方便。

swap 文件放在指定分区的文件系统里面,所以有可能受文件系统性能的影响,但据说 2.6 版本以后的内核可以直接访问 swap 文件对应的物理磁盘地址,相当于跳过了文件系统直接访问磁盘,不过如果 swap 文件在磁盘上的物理位置不连续时,还是会对性能产生不利影响,但其优点就是灵活,随时可以增加和移除 swap 文件。

查看swap

查看系统中,已经配置的 swap,可以使用 free 命令,具体命令如下:

free -m

运行后,终端输出如下:

15_Linux swap分区.png

我们看到,输出了 swap 分区的大小,我们也可以使用 swapon 命令查看系统中在用的 swap,具体命令如下:

swapon -s

运行后,终端输出如下:

16_Linux swap分区.png

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

参数 描述
Filename 如果 swap 类型是分区,这里将是分区的路径,如果 swap 类型是文件,这里将是文件的路径。
Type swap 的类型,partition 代表这是一个 swap 分区,file 代表这是一个 swap 文件。
Size swap 的大小,单位是 k。
Used 已经被使用的大小。
Priority 优先级,优先级高的 swap 将会被优先使用,同等优先级的 swap 将会被均匀的使用(round-robin算法),优先级可以通过 “swapon -p” 命令来设置。

查看swap in/out

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

vmstat

运行后,终端输出如下:

17_Linux swap分区.png

我们看到,我们使用了 vmstat 命令,查看了 swap 信息。

添加swap分区

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

# 本例中将使用/dev/sdb1这个分区 sudo fdisk -l /dev/sdb # 创建swap分区 sudo mkswap /dev/sdb1 # 查看系统中现在正在使用的swap,以便于和添加后做比较 swapon -s # 将新的分区加入到系统中 sudo swapon /dev/sdb1

取消swap

如果经过深思熟虑之后,确定不再需要 swap,那么可以将所有的swap分区和文件从系统中移除,具体命令如下:

# 停掉所有系统正在使用的swap sudo swapoff -a

优化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 的值:

cat /proc/sys/vm/swappiness

运行后,终端输出如下:

18_Linux swap分区.png

修改当前系统中 swappiness 的值:

sudo sysctl vm.swappiness=10

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

vm.swappiness=10

Linux swap分区总结

Linux 中的 swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。

简单点说,当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是我们常说的 swap out 和 swap in。