Linux 交换空间管理
文章目录
- Linux 交换空间管理
- 计算机存储器的层次结构
- 计算机存储器的工作原理
- 物理内存
- Swap 空间
- 查看内存
- Swap 空间大小
- 创建交换空间
- 激活与取消swap 空间
- 持久化激活 swap 空间
Linux 交换空间管理
计算机存储器的层次结构
计算机存储器的速度与成本通常成正比,为了实现良好的性能 / 价格比,各种存储器组成一个层状的塔式结构,相互配合工作。
-
CPU 寄存器:是 CPU 内部用于存放数据的小型存储区域,可暂时存放参与运算的数据、运算结果以及 CPU 运行所需的信息。
-
CPU 高速缓存(CPU Cache):一种容量小、速度快的高缓冲存储器,由 SRAM 组成,直接制作在 CPU 芯片内,速度接近 CPU。在存储体系中位于第二层,仅次于 CPU 寄存器,容量远小于内存,但速度可接近处理器频率。
-
主存储器(Main memory,简称主存或内存)
:用于存放指令和数据,能由中央处理器直接随机存取。其速度比 CPU 高速缓存慢,但存储容量大得多。
-
速度:一般用存取时间衡量,即每次与 CPU 间数据处理耗费的时间,单位为纳秒 (ns),多数 SDRAM 内存芯片的存取时间为 5、6、7、8 或 10ns。
-
带宽
:计算公式为带宽=频率 × 位宽 ÷8。例如,DDR4 内存频率是 3600MHz,在 64 位系统中:
- 单通道 DDR4 - 3600:3600MHz×64bit÷8 = 28800MB/S
- 双通道 DDR4 - 3600:3600MHz×64bit×2÷8 = 57600MB/S
-
-
辅助存储器:速度较慢,但容量大,可实现持久化存储,如机械磁盘、光盘、U 盘等。
计算机存储器的工作原理
CPU 运行程序时,数据读取遵循以下流程:
- 先从寄存器中读取数据,若找到则直接读取;若未找到,从 CPU Cache 中读取,并将数据缓存在 CPU Cache 中。
- 若在 CPU Cache 中找到数据,直接读取;若未找到,从主存储器(内存)中读取,并将数据缓存在主存储器中。
- 若在内存中找到数据,直接读取;若未找到,从辅助存储器中读取,并将数据缓存在内存中。
物理内存
计算机系统将内存划分为固定大小的块,称为 page,标准 page 大小为 4KiB。进程不直接对物理内存寻址,每个进程都有虚拟地址空间(virtual address space)。当进程请求内存时,内存管理单元(MMU)会将进程获得的虚拟地址(VA,Virtual Address)映射到物理地址(PA,Physical Address)。
MMU 是 CPU 中用于管理虚拟存储器、物理存储器的控制线路,负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问授权。
Swap 空间
在 Linux 系统中,Swap(交换)空间是受内核内存子系统控制的磁盘区域,其核心作用是在物理内存不足时提供辅助支持,类似于 Windows 系统中的虚拟内存(pagefile.sys)。
Swap,意思是“交换”、“实物交易”。Linux Swap(交换)空间是受Linux内核内存子系统控制的磁盘区域。
- 功能1:当内存使用量超过定义的限制时,内核寻找已分配给进程但空闲的内存页,将该空闲的内存页写入到交换空间,并向其他进程重新分配RAM页面。
- 功能2:如果某个程序需要访问磁盘上的页面,则内核会找到另一个空闲的内存页, 将其写入到磁盘,然后从交换区重新调用所需的页面。
- 功能3:如果某个程序需要访问数据,访问的数据存放在交换空间,则该程序直接从交换空间读取数据,而不需要从磁盘原始位置读取,进而提高速度。
主要功能
- 内存调剂:当物理内存使用量超过设定限制时,内核会找出已分配给进程但暂时空闲的内存页,将其写入交换空间,释放出的物理内存供其他进程使用。
- 页面调度:若程序需要访问已被换出到磁盘的页面,内核会先将另一块空闲内存页写入磁盘,再从交换空间调回所需页面。
- 加速访问:若程序所需数据已在交换空间中,可直接从交换空间读取,无需从原始磁盘位置读取,提升访问速度。
查看内存
可使用 free
命令查看内存情况,默认单位是 KiB,使用 -m
选项可改为以 MiB 为单位:
[root@centos7 ~]# free total used free shared buff/cache available
Mem: 4026156 330460 3528844 12136 166852 3485576
Swap: 4063228 0 4063228
输出说明:
- 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 量。
创建交换空间
[root@server ~ 14:57:06]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part ├─centos_c01-root 253:0 0 47G 0 lvm /└─centos_c01-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sde 8:64 0 20G 0 disk
sdf 8:80 0 20G 0 disk
sdg 8:96 0 20G 0 disk
sr0 11:0 1 4.4G 0 rom
[root@server ~ 14:57:10]# parted /dev/sdb mklabel gpt
信息: You may need to update /etc/fstab.# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap
[root@server ~ 15:00:34]# parted /dev/sdb unit MiB mkpart swap linux-swap 1 2049
信息: You may need to update /etc/fstab.[root@server ~ 15:01:57]# 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 swap[root@server ~ 15:02:15]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part # 格式化swap空间
[root@server ~ 15:03:03]# mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old xfs signature.
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=7c677930-d6a3-499b-8699-8fc153d608b9
激活与取消swap 空间
默认情况下,多个交换空间具有相同的优先级时,系统会按顺序使用交换空间,即内核先使用第一个已激活交换空间,直至其空间已满,然后开始使用第二个交换空间。在激活交换分区的时候,可以为每个交换空间定义一个优先级,从而强制按该顺序使用交换空间。
[root@server ~ 15:10:22]# swapoff -a
[root@server ~ 15:10:36]# swapon -s
[root@server ~ 15:10:39]# swapon -a
[root@server ~ 15:10:43]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 2097148 0 -2
/dev/sdb1 partition 2097148 0 -3
持久化激活 swap 空间
修改/etc/fstab文件,添加如下类似记录:
UUID=7c677930-d6a3-499b-8699-8fc153d608b9 swap swap defaults 0 0
使用命令swapon -a
激活/etc/fstab
中所有交换设备。
使用命令swapoff -a
取消/etc/fstab
中所有交换设备激活。
[root@server ~ 15:07:40]# blkid /dev/sdb1
/dev/sdb1: UUID="7c677930-d6a3-499b-8699-8fc153d608b9" TYPE="swap" PARTLABEL="swap" PARTUUID="21241760-2b20-42a5-8559-f259536b3a48"
[root@server ~ 15:09:07]# vim /etc/fstab
[root@server ~ 15:13:08]# cat /etc/fstab #
# /etc/fstab
# Created by anaconda on Tue Sep 2 10:18:33 2025
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos_c01-root / xfs defaults 0 0
UUID=4cedadff-6f74-4816-8b1c-ffff69c5ba45 /boot xfs defaults 0 0
/dev/mapper/centos_c01-swap swap swap defaults 0 0
UUID=7c677930-d6a3-499b-8699-8fc153d608b9 swap swap defaults 0 0
[root@server ~ 15:13:19]# freetotal used free shared buff/cache available
Mem: 4026116 170400 2821032 11852 1034684 3624488
Swap: 4194296 0 4194296
[root@server ~ 15:13:33]# reboot连接断开
连接主机...
连接主机成功
Last login: Tue Sep 23 10:43:07 2025 from 10.1.8.1
[root@server ~ 15:14:44]# swapon -s
文件名 类型 大小 已用 权限
/dev/sdb1 partition 2097148 0 -2
/dev/dm-1 partition 2097148 0 -3
[root@server ~ 15:14:53]# freetotal used free shared buff/cache available
Mem: 4026124 163396 3746420 11860 116308 3678092
Swap: 4194296 0 4194296