1

什么是 swap 分区?

内存分为物理内存与虚拟内存,物理内存就是实际内存,由 RAM 芯片组成的。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。

当用户执行程序时,产生进程在系统上运行。系统会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到虚拟内存中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。

类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。Android 是基于 Linux 的操作系统,所以也可以使用 swap 分区来提升系统运行效率。即和 Windows 的虚拟内存(pagefile.sys)的作用是一样的。

这里的虚拟内存即所谓的 swap,从这也可以看出 swap 扮演了一个非常重要的角色,就是暂存被换出的进程。

内存与 swap 之间是按照内存页为单位来交换数据的,一般 Linux 中页的大小设置为 4kb。而内存与磁盘则是按照块来交换数据的。

读懂内存使用情况

1 root@jasons:~# free -m
2 free -m
3              total       used       free     shared    buffers     cached
4 Mem:          1987       1717        270         61        114        869
5 -/+ buffers/cache:        733       1254
6 Swap:          255        255          0
7 root@jasons:~#

Mem 行显示了从系统角度看来内存使用的情况,total 是系统可用的内存大小,数量上等于系统物理内存减去内核保留的内存。

bufferscached 是系统用做缓冲的内存。buffers 与某个块设备关联,包含了文件系统元数据,并且跟踪了块的变化;cache 只包含了文件本身。

-/+ buffers/cache 行则从用户角度显示内存信息,可用内存从数量上等于 Memused 列值减去 bufferscached 内存的大小。

因为 bufferscached 是操作系统为加快系统运行而设置的,当用户需要时,可以直接为用户使用。

swap 行便是系统的 swap 信息。

在日常应用中,例如通过上述命令看到交换空间的使用情况为 0,那么就不需要很大的虚拟内存,甚至可以完全不需要另辟硬盘空间作为虚拟内存。

添加 swap 交换分区/空间

两种选择:

  • 添加一个交换分区
  • 添加一个交换文件

推荐添加一个交换分区,若没有多少空闲空间可用,则添加交换文件 。

需要注意的……

需要注意的是,虽然这个 swap 分区能够作为“虚拟”的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于 swap,最好的办法仍然是加大物理内存,swap 分区只是临时的解决办法。

交换分区(swap)的合理值一般在内存的 2 倍左右?

物理内存我们是无法更改的,所以 swap 的大小设置将会影响应用能否正常运行。那么 swap 大小如何确定呢?

一种流行的说法是,安装 Linux 系统时,交换分区 swap 的大小应该是内存的两倍。也就是说,如果内存是 2G,那么就应该分出 4G 的硬盘空间作为交换空间。

例如根据 CentOS 官网介绍可以得出如下公式:

1 M = Amount of RAM in GB, and S = Amount of swap in GB, 
2 then If M < 2, S = M * 2 else S = M + 2

而且其最小不应该小于 32 M(never less than 32 MB)。

其实在某种情况下这是严重的浪费。

真实的情况是:可以根据系统内存的大小,以及所使用的程序,自行决定交换分区的大小,当然甚至可以完全不用交换分区。

swap 分区的数量对性能也有很大的影响。因为 swap 毕竟还是以磁盘来伪装成内存,交换的操作是磁盘 IO 的操作而不是内存的 load 与 store 操作。如果有多个 swap 交换区,每个 swap 会有一定的优先级,该优先级也可以调整。swap 空间的分配会以轮流的方式操作于所有的 swap,这样会大大均衡 IO 的负载,加快 swap 交换的速度。

swappiness 的设置

综上所述,当物理内存使用完或者达到一定比例之后,我们可以使用 swap 做临时的内存使用。当物理内存和 swap 都被使用完那么就会出错,out of memory。对于使用多大比例内存之后开始使用 swap,在系统的配置文件中可以通过调整参数进行修改。

1 cat  /proc/sys/vm/swappiness
2 60

该参数可以从 0-100 进行设置。0 就是最大限度使用内存,尽量不使用 swap;100 就是积极使用 swap。

  1. 题图照片授权来自 Ada