27.Linux swap交换空间管理
文章目录
- Linux交换空间管理
- 认识swap交换空间
- SWAP交换空间
- 查看内存
- Swap 空间大小
- 创建交换空间
- 激活 swap 空间
- 取消 swap 空间激活
- 持久化激活 swap 空间
Linux交换空间管理
认识swap交换空间
首先,我们拥有一台电脑,电脑内存(RAM),把这个内存想象成一个办公室的工位,而硬盘相当于一个巨大的档案室。里面的数据存放的特点如下:
工位(内存):
- 空间有限,但速度快。工作人员(CPU)可以瞬间拿到工位上的任何文件(数据)进行处理
- 工位是固定的。当需要处理的任务越来越多,文件堆满了所有工位,新任务就没办法开展了
档案室(硬盘):
- 空间巨大,存放的数据很多,但速度慢。从档案室调取一份文件需要来回跑,花费很长时间。(可以在Windows的文件资源管理器中的搜索试试查找一个文件,一般来说肯定是要等一会才会有结果)
- 文件可以长期存储
问题来了:如果此时工位堆满了文件,这时候老板突然下发了一个优先级不高但是很占地方的临时任务,工位(内存)满了,怎么办?
swap交换空间就是解决方法:
从档案室(硬盘)里临时划分一部份区域,作为溢出工作区。
- 将工位上暂时不用的文件打包,贴上标签放到档案室的临时区域
- 工位上腾出的空间用来存放临时任务的文件
- 当需要之前打包的文件时,根据标签去档案室取回来即可
计算机内存工作原理也是一样:
- 工位满了 = 物理内存(RAM)快用完了
- 档案室里的临时区域 = 硬盘上划出的交换空间(一个特殊的分区或文件)
- 打包不用的文件放到临时区域 = 操作系统将内存中暂时不活跃的数据“交换”(Swap Out)到硬盘的交换空间里
- 腾出工位 = 释放出物理内存(RAM)给当前紧急的任务使用
- 取回文件 = 当需要那些被交换出去的数据时,系统再把它们从交换空间“交换”(Swap In)回内存
**思考:**为什么CPU不直接访问物理地址?
- 虚拟内存的容量是物理内存和交换空间的总和,而虚拟地址负责映射到物理内存地址和交换空间地址。
- 进程使用内存的过程中,希望内存是连续的。如果进程直接访问物理地址,则内核很难保证进程获得的物理地址空间是连续的,因为进程存在着运行和退出,就会出现内存碎片化。进程的虚拟地址在虚拟内存中是连续的,达到了内存连续的目的,而 MMU 会将进程的虚拟地址映射到物理地址。
**交换空间只是临时的解决办法。**虽然交换空间能够作为"虚拟"内存使用,但由于交换区位于磁盘上,它的速度比物理内存慢的多,因此如果需要更快的速度的话,最好的办法仍然是加大物理内存。
SWAP交换空间
查看内存
# 默认单位是KiB,使用-m选项,以MiB为单位
[root@server ~ 16:43:24]# freetotal used free shared buff/cache available
Mem: 4026116 215572 3478336 11900 332208 3580652
Swap: 2097148 0 2097148[root@server ~ 17:28:51]# free -mtotal used free shared buff/cache available
Mem: 3931 210 3404 11 316 3496
Swap: 2047 0 2047
输出说明:
-
Mem:
-
total:物理内存空间大小。
-
used:使用的内存 (total - free - buffers - cache)。
-
free:未使用的内存空间大小(真正的空闲,未被任何程序占用)。
-
shared:多个进程共享的内存空间大小。
-
cached:从磁盘读取的数据占用的内存空间大小,待以后使用(数据没有被修改)。
-
buffers:被更改但未写回磁盘的数据占用的内存空间大小。
-
-
Swap:
-
total:交换空间大小。
-
used:使用的交换空间大小。
-
free:未使用交换空间大小。
-
Swap 空间大小
管理员应根据系统的内存工作负载来调整交换空间大小。 应用供应商有时会提供这方面的建议。根据物理内存总量,下表提供了一些指导。
物理内存(RAM) | 交换空间 | 允许HIBERNATE时的交换空间 |
---|---|---|
2GiB或以下 | 两倍的RAM | 三倍的RAM |
2GiB和8GiB之间 | 同等的RAM | 两倍的RAM |
8GiB和64GiB之间 | 至少4GiB | 1.5倍的RAM |
64GiB以上 | 至少4GiB | 不建议Hibernate |
笔记本电脑和台式机的Hibernate功能会在关闭系统电源之前使用交换空间来保存RAM内容。重新打开系统时, 内核将从交换空间恢复RAM内容,无需完全启动。 对于这些系统而言,交换空间需要超过RAM量。
创建交换空间
# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap
[root@server ~ 17:32:00]# parted /dev/sdb mklabel gpt
[root@server ~ 17:32:20]# parted /dev/sdb unit mib mkpart swap linux-swap 1 2049
[root@server ~ 17:33:01]# parted /dev/sdb unit mib print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: Number Start End Size File system Name 标志1 1.00MiB 2049MiB 2048MiB xfs swap# 格式化swap空间
[root@server ~ 17:33:14]# mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old xfs signature.
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=f5015001-86bb-4cba-ab23-4965aa81647e
[root@server ~ 17:33:36]# parted /dev/sdb unit mib print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: Number Start End Size File system Name 标志1 1.00MiB 2049MiB 2048MiB linux-swap(v1) swap
激活 swap 空间
# 激活swap空间
[root@server ~ 17:33:44]# swapon /dev/sdb1# 查看swap设备列表
[root@server ~ 17:35:57]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 2097148 0 -2
/dev/sdb1 partition 2097148 0 -3
默认情况下,多个交换空间具有相同的优先级时,系统会按顺序使用交换空间,即内核先使用第一个已激活交换空间,直至其空间已满,然后开始使用第二个交换空间。在激活交换分区的时候,可以为每个交换空间定义一个优先级,从而强制按该顺序使用交换空间。
swapon 命令使用-p选项指定优先级,优先级介于-1和32767之间,值越大优先级越高。
示例:
# 修改优先级前要先把该交换空间停掉
[root@server ~ 17:36:08]# swapon -p 4 /dev/sdb1
[root@server ~ 17:38:14]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 2097148 0 -2
/dev/sdb1 partition 2097148 0 4
取消 swap 空间激活
[root@server ~ 17:38:29]# swapoff /dev/sdb1
[root@server ~ 17:38:42]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 2097148 0 -2
持久化激活 swap 空间
修改/etc/fstab文件,添加如下类似记录:
UUID=f5015001-86bb-4cba-ab23-4965aa81647e swap swap pri=4 0 0
使用命令swapon -a
激活/etc/fstab中所有交换设备。
使用命令swapoff -a
取消/etc/fstab中所有交换设备激活。
[root@server ~ 17:38:49]# swapon -a
[root@server ~ 17:39:52]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 2097148 0 -2
/dev/sdb1 partition 2097148 0 -3[root@server ~ 17:39:55]# swapoff -a
[root@server ~ 17:40:18]# swapon -spartition 2097148 0 -2
/dev/sdb1 partition 2097148 0 -3[root@server ~ 17:39:55]# swapoff -a
[root@server ~ 17:40:18]# swapon -s