我们需要 swap 吗?
什么是 swap 分区?
内存分为物理内存与虚拟内存,物理内存就是实际内存,由 RAM 芯片组成的。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。
当用户执行程序时,产生进程在系统上运行。系统会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到虚拟内存中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。
类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。Android 是基于 Linux 的操作系统,所以也可以使用 swap 分区来提升系统运行效率。即和 Windows 的虚拟内存(pagefile.sys)的作用是一样的。
这里的虚拟内存即所谓的 swap,从这也可以看出 swap 扮演了一个非常重要的角色,就是暂存被换出的进程。
内存与 swap 之间是按照内存页为单位来交换数据的,一般 Linux 中页的大小设置为 4kb。而内存与磁盘则是按照块来交换数据的。
读懂内存使用情况
Mem
行显示了从系统角度看来内存使用的情况,total
是系统可用的内存大小,数量上等于系统物理内存减去内核保留的内存。
buffers
和 cached
是系统用做缓冲的内存。buffers
与某个块设备关联,包含了文件系统元数据,并且跟踪了块的变化;cache
只包含了文件本身。
-/+ buffers/cache
行则从用户角度显示内存信息,可用内存从数量上等于 Mem
行 used
列值减去 buffers
和 cached
内存的大小。
因为 buffers
和 cached
是操作系统为加快系统运行而设置的,当用户需要时,可以直接为用户使用。
swap
行便是系统的 swap 信息。
在日常应用中,例如通过上述命令看到交换空间的使用情况为 0,那么就不需要很大的虚拟内存,甚至可以完全不需要另辟硬盘空间作为虚拟内存。
添加 swap 交换分区/空间
两种选择:
- 添加一个交换分区
- 添加一个交换文件
推荐添加一个交换分区,若没有多少空闲空间可用,则添加交换文件 。
需要注意的……
需要注意的是,虽然这个 swap 分区能够作为“虚拟”的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于 swap,最好的办法仍然是加大物理内存,swap 分区只是临时的解决办法。
交换分区(swap)的合理值一般在内存的 2 倍左右?
物理内存我们是无法更改的,所以 swap 的大小设置将会影响应用能否正常运行。那么 swap 大小如何确定呢?
一种流行的说法是,安装 Linux 系统时,交换分区 swap 的大小应该是内存的两倍。也就是说,如果内存是 2G,那么就应该分出 4G 的硬盘空间作为交换空间。
例如根据 CentOS 官网介绍可以得出如下公式:
而且其最小不应该小于 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,在系统的配置文件中可以通过调整参数进行修改。
该参数可以从 0-100 进行设置。0 就是最大限度使用内存,尽量不使用 swap;100 就是积极使用 swap。
-
题图照片授权来自 Ada ↩
麦子(Jason),没做过英语老师的印象大使不是合格的通信工程师。
戳「这里」约。
最近更新
留言互动