# Swap内存

## 简介

Swap内存，即交换区内存，也叫虚拟内存。它的本质是物理磁盘拿出来一部分伪装成内存的区域。

## 为什么要有Swap内存

我们知道程序是运行在内存中的，程序从内存中读写数据的速度仅低于cpu，但比磁盘高不止一个数量级。一台机器的内存是有限的，当机器的cpu不够用时，就必须把内存中不经常运行的程序给踢出去，踢到哪里呢，这个时候swap交换区就出现了。当内存不够的时候，被踢出去的程序就暂存在swap交换区中，当需要这个被踢出去的进程的时候，就从交换区重新加载到内存，**否则它不会主动交换到内存中**，这种换入换出的操作实现了内存的循环利用，让用户感觉不到内存的限制。

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

## Swap内存的设置

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

```
cat  /proc/sys/vm/swappiness
60
```

该参数可以从0-100进行设置。0就是最大限度使用内存，尽量不使用swap；100就是积极使用swap。这个具体的通过系统的算法进行确定。

物理内存我们是无法更改的，所以swap的大小设置将会影响应用能否正常运行。那么swap大小如何确定。根据centos官网介绍可以得出如下公式：M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < 2, S = M \*2 Else S = M + 2。而且其最小不应该小于32M(never less than 32 MB)。

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

**swap相关命令**

```
swapon/swapoff swap-disk_name：启动和关闭相应的swap_disk_name
swapon -s ：可以查看当期swap的使用情况，也可以通过 cat /proc/swaps命令查看
```
