交换(Swapping)是将内存页复制到硬盘上的预配置空间【称为交换空间(Swap-Space)】以释放该内存页的过程。物理内存(the physical memory)和交换空间(the swap space)的组合大小就是可用的虚拟内存(virtual memory)量。
有两个重要原因导致需要交换:
但是,交换(swapping)确实有缺点。与内存相比,磁盘非常慢。内存速度可以以纳秒为单位,而磁盘以毫秒为单位,因此访问磁盘可能比访问物理内存慢数万倍。发生的交换越多,您的系统就越慢。有时,当页面被换出(swapped out),然后很快换入(swapped in),然后再次换出(swapped out)时,会发生过度交换或抖动。在这种情况下,系统正在努力寻找可用内存并同时保持应用程序运行。在这种情况下,仅添加更多 RAM 会有所帮助。
Linux 有两种形式的交换空间(swap space):交换分区(the swap partition)和交换文件(the swap file)。
注意:在阅读下面的内容时候,请区分: 交换空间(swap space), 交换分区(swap partition), 交换文件(swap file) 这三个概念。
要查看您有多少交换空间(swap space),请使用命令 swapon -s
。输出将如下所示:
- Filename Type Size Used Priority
- /dev/sda5 partition 859436 0 -1
每行列出了系统正在使用的一个单独的交换空间(swap space)。这里,
Type
字段表明这个交换空间是一个分区(partition)而不是一个文件(file)Filename
我们看到它在磁盘sda5上。Size
以千字节为单位列出,Used
字段告诉我们已经使用了多少千字节的交换空间(在这种情况下没有)。Priority
告诉 Linux 首先使用哪个交换空间。Linux 交换子系统的一大优点是,如果以相同的优先级挂载两个(或更多)交换空间(最好在两个不同的设备上),Linux 将在它们之间交错其交换活动,这可以大大提高交换性能。
要将额外的交换分区(extra swap partition)添加到您的系统,您首先需要准备它。第一步是确保分区被标记为交换分区(swap partition),第二步是制作交换文件系统(swap filesystem)。
要检查分区是否标记为交换,请以 root 身份运行:
fdisk -l /dev/hdb
将 /dev/hdb 替换为系统上带有交换分区的硬盘设备。您应该会看到如下所示的输出:
- Device Boot Start End Blocks Id System
- /dev/hdb1 2328 2434 859446 82 Linux swap / Solaris
如果分区未标记为交换分区(swap partition),则需要通过运行 fdisk 并使用t
选项来更改它。处理分区时要小心——你不想错误地删除重要的分区或错误地将系统分区的 id 更改为交换。交换分区上的所有数据都将丢失,因此请仔细检查您所做的每项更改。另请注意,Solaris 对其分区使用与 Linux 交换空间相同的 ID,因此请注意不要错误地终止 Solaris 分区。
一旦分区被标记为交换区,您需要以 root 用户身份使用 mkswap (make swap) 命令准备它:
mkswap /dev/hdb1
如果您没有看到任何错误,您的交换空间(swap space)就可以使用了。要立即激活它,请键入:
swapon /dev/hdb1
可以通过运行 swapon -s
来验证它是否正在被使用。要在启动时自动挂载交换空间,您必须向 /etc/fstab
文件添加一个条目,该文件包含需要在启动时挂载的文件系统和交换空间的列表。每行的格式为:
由于交换空间(swap space)是一种特殊类型的文件系统,其中许多参数不适用。对于交换空间,添加:
/dev/hdb1 none swap sw 0 0
参数说明:
/dev/hdb1
是交换分区(the swap partition)。要检查交换空间(swap space)是否自动挂载而无需重新启动,您可以依次运行
swapoff -a
命令 ---> 关闭所有交换空间swapon -a
命令 ---> 挂载 /etc/fstab 文件中列出的所有交换空间)swapon -s
命令 ---> 检查所有的交换空间。除了交换分区(swap partition),Linux 还支持交换文件(Swap file),您可以以类似于交换分区的方式创建、准备和挂载该文件。
交换文件(Swap file)的优点是您不需要找到一个空分区或重新分区磁盘来添加额外的交换空间。
要创建交换文件,请使用 dd 命令创建一个空文件。要创建 1GB 文件,请键入:
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
其中:/swapfile
是交换文件的名称,1048576 的计数是以千字节(即1GB)为单位的大小。
像准备分区一样使用 mkswap
准备交换文件,但这次使用交换文件的名称:
mkswap /swapfile
同样,使用 swapon 命令挂载它:swapon /swapfile
。
交换文件的 /etc/fstab
条目如下所示:
/swapfile none swap sw 0 0
可以在没有交换空间(swap space)的情况下运行 Linux 系统,如果您有大量内存,系统将运行良好; 但如果您用完物理内存,则系统将崩溃,因为它无能为力,所以建议有一个交换空间,特别是因为磁盘空间相对便宜。
关键问题是多少钱?旧版本的 Unix 类型操作系统(例如 Sun OS 和 Ultrix)需要物理内存两到三倍的交换空间。现代实现(如 Linux)不需要那么多,但如果你配置它,他们可以使用它。一个经验法则如下:
上面说了当内存不够用的时候会用到Swap分区,那什么时候算是不够用? 切记,不是当内存完全用完了,一点不剩的时候叫做不够用。什么叫做不够用,由Swappiness参数来定。
注意,这里是以简单的容易理解的方式说Swappiness参数的意义,其实Swappiness准确来说不是这么解释的
Swappiness 可以设置为 0 到 100 之间的值。
swappiness=0
: 表示最大限度使用物理内存,然后才是 swap空间,swappiness=100
: 表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能。
举例: 某笔记本电脑有 16 GB 的内存和 8 GB 的交换空间。如果我在内核参数中使用 60 swappiness,那么在使用大约 6 GB (16G*40% == 6.4G)的内存后,我的机器开始使用交换,这不必要地使我的应用程序变慢。所以,我们应该知道如何更改这个内核参数。
关于来自GitHub上最权威的解释:
This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.
翻译后如下:
这个参数用于定义内核交换内存页的攻击性。较高的值会增加攻击性,较低的值会减少交换量。当设置为0 表示内核在空闲页和文件备份页的数量小于区域中的高水位线之前不启动交换。
来自GitHub上代码:https://github.com/torvalds/linux/blob/master/mm/vmscan.c#L176
- /*
- * From 0 .. 200. Higher means more swappy.
- */
- int vm_swappiness = 60;
Linux 2.6 内核添加了一个名为swappiness的新内核参数,让管理员可以调整 Linux 交换的方式。它是一个从 0 到 100 的数字。
本质上,较高的值会导致更多的页面被交换,而较低的值会导致更多的应用程序保留在内存中,即使它们处于空闲状态。
原文:
In essence, higher values lead to more pages being swapped, and lower values lead to more applications being kept in memory, even if they are idle.
要检查系统上的当前 swappiness 值,请使用以下 cat 命令:
- cat /proc/sys/vm/swappiness
-
- # 大多数 Linux 发行版上的默认 swappiness 值为 60
可以用来确定 swappiness 值的另一个命令是 sysctl :
- sysctl vm.swappiness
- vm.swappiness = 60
临时调整的方法如下,我们调成10:
- # 方法1:
- [root@timeserver ~]# sysctl vm.swappiness=10
- vm.swappiness = 10
-
- # 方法2:
- [root@timeserver ~]# echo 10 > /proc/sys/vm/swappiness
新值会立即使用,无需重新启动。 这只是临时调整的方法,重启后会回到默认设置的
要想永久调整的话,需要在/etc/sysctl.conf修改,加上:
- [root@timeserver ~]# cat /etc/sysctl.conf
-
- # Controls the maximum number of shared memory segments, in pages
- kernel.shmall = 4294967296
- vm.swappiness=10
激活设置
[root@timeserver ~]# sysctl -p
如果你想清除掉的空间,你可以运行下面的命令:
swapoff -a && swapon -a
命令的解释:
swapon
命令用于激活Linux系统中交换空间,Linux系统的内存管理必须使用交换区来建立虚拟内存。swapoff
命令用于关闭指定的交换空间(包括交换文件和交换分区)。swapoff实际上为swapon的符号连接,可用来关闭系统的交换区。在Man中关于这两个命令的描述:
swapon, swapoff - enable/disable devices and files for paging and swapping
swapon is used to specify devices on which paging and swapping are to take place.
swapoff disables swapping on the specified devices and files.
语法:
swapon (选项) (参数)
选项:
-a
:将/etc/fstab文件中所有设置为swap的设备,启动为交换区;-h
:显示帮助;-p<优先顺序>
:指定交换区的优先顺序;-s
:显示交换区的使用状况;-V
:显示版本信息。语法:
swapoff (选项) (参数)
选项:
-a
:关闭配置文件“/etc/fstab”中所有的交换空间。