# 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命令查看
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/ji-suan-ji-yuan-li/swap-nei-cun.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
