Linux Swap 空间精细化管理指南
Linux Swap 空间精细化管理指南
一、计算机存储器的层次结构
计算机存储器的性能与成本呈正相关,为实现最优的性能 / 价格比,系统会将不同类型的存储器构建为层级化的塔式结构,各层级各司其职、协同工作。
1.1 核心存储层级说明
-
CPU 寄存器:CPU 内部的小型存储单元,用于临时存储运算数据、运算结果及 CPU 运行所需的核心信息,是存储层级中速度最快的组件。
-
CPU 高速缓存(CPU Cache):由 SRAM 构成,集成在 CPU 芯片内,速度接近 CPU 主频。作为存储层级第二层,容量远小于内存,但能大幅降低 CPU 访问内存的延迟。
-
主存储器(内存)
:可被 CPU 直接随机存取,用于存放指令和数据。速度低于 CPU Cache,但存储容量显著更大。
-
存取时间:衡量内存速度的核心指标,指 CPU 与内存间单次数据交互的耗时,单位为纳秒(ns)。主流 SDRAM 内存芯片存取时间为 5~10ns。
-
带宽计算
:带宽 = 频率 × 位宽 ÷ 8(1B=8bit)。
- 单通道 DDR4-3600:3600MHz × 64bit ÷ 8 = 28800MB/S
- 双通道 DDR4-3600:3600MHz × 64bit × 2 ÷ 8 = 57600MB/S
-
-
辅助存储器:速度远低于内存,核心优势是容量大且支持持久化存储,典型设备包括机械硬盘、固态硬盘、光盘、U 盘等。
主存储器的带宽计算公式:带宽=频率*位宽/8。
例如:DDR4 内存频率是3600 MHz,在64位系统(双通道位宽为128,以此类推),1B=8bit,
- 单通道 DDR4-3600:3600MHz * 64bit / 8=28800MB/S
- 双通道 DDR4-3600:3600MHz * 64bit * 2 / 8=57600MB/S
- 辅助存储器,速度慢的多,优点是容量大,可持久化存储。
二、计算机存储器的工作原理

CPU 读取数据遵循 “由快到慢” 的层级查找逻辑,具体流程如下:
- 优先从 CPU 寄存器读取数据;若未找到,则从 CPU Cache 读取,并将数据缓存至 CPU Cache。
- 若 CPU Cache 中存在目标数据,直接读取;若未找到,则从内存读取,并将数据缓存至内存。
- 若内存中存在目标数据,直接读取;若未找到,则从辅助存储器读取,并将数据缓存至内存。
三、物理内存与虚拟内存机制
3.1 物理内存的分页管理
系统将物理内存划分为固定大小的页(page),标准页大小为 4 KiB。进程无法直接寻址物理内存,而是通过虚拟地址空间(virtual address space) 访问内存。
内存管理单元(MMU,Memory Management Unit)负责将进程的虚拟地址(VA,Virtual Address)映射为物理地址(PA,Physical Address),MMU 是 CPU 中管理虚拟 / 物理存储器的核心控制线路,同时提供内存访问授权的硬件机制。
3.2 虚拟地址的核心价值(CPU 不直接访问物理地址的原因)
- 扩展内存容量:虚拟内存总容量 = 物理内存容量 + 交换空间容量,虚拟地址可映射至物理内存或交换空间地址。
- 保证内存连续性:进程运行时需连续的内存空间,若直接访问物理地址,内存碎片化会导致难以分配连续空间;而虚拟地址在虚拟内存中始终连续,MMU 可将其映射至离散的物理地址,满足进程对连续内存的需求。
四、Swap 空间核心概念
Linux Swap 空间是由内核内存子系统管理的磁盘区域,本质是 “磁盘模拟的虚拟内存”,功能与 Windows 虚拟内存(pagefile.sys)一致,核心作用是缓解物理内存不足的问题。
4.1 Swap 空间核心功能
- 内存超限时,将进程空闲的内存页写入 Swap 空间,释放物理内存分配给其他进程。
- 当程序需访问已写入磁盘的内存页时,内核将另一空闲内存页写入磁盘,再从 Swap 空间加载目标页至物理内存。
- 程序访问存储在 Swap 空间的数据时,可直接从 Swap 读取,无需访问数据的原始磁盘位置,提升读取效率。

4.2 注意事项
Swap 空间仅为临时解决方案:由于磁盘 IO 速度远低于物理内存,过度依赖 Swap 会导致系统性能显著下降。长期优化需通过扩容物理内存解决。
五、内存与 Swap 空间的查看方法
5.1 free 命令查看内存状态
# 默认单位是KiB,使用-m选项,以MiB为单位
[root@server ~ 16:49:24]# free
total used free shared buff/cache available
Mem: 4026116 181724 3739720 8628 104672 3667108
Swap: 4063228 0 4063228
5.2 输出字段说明
| 字段 | 说明 |
|---|---|
| Mem - total | 物理内存总容量 |
| Mem - used | 已使用内存(计算公式:total - free - buffers - cache) |
| Mem - free | 完全空闲的物理内存(未被任何程序占用) |
| Mem - shared | 多进程共享的内存容量 |
| Mem - cached | 缓存从磁盘读取的数据的内存容量(数据未修改,可复用) |
| Mem - buffers | 缓存已修改但未写回磁盘的数据的内存容量 |
| Swap - total | Swap 空间总容量 |
| Swap - used | 已使用的 Swap 空间容量 |
| Swap - free | 空闲的 Swap 空间容量 |
六、Swap 空间大小规划建议
Swap 空间大小需结合物理内存(RAM)容量和业务需求调整,应用厂商建议优先遵循,通用规划标准如下:
| 物理内存 (RAM) | 常规 Swap 空间大小 | 支持 HIBERNATE 的 Swap 空间大小 |
|---|---|---|
| ≤2GiB | 2×RAM | 3×RAM |
| 2GiB~8GiB | 1×RAM | 2×RAM |
| 8GiB~64GiB | ≥4GiB | 1.5×RAM |
| >64GiB | ≥4GiB | 不建议启用 Hibernate |
注:Hibernate 功能会在关机前将 RAM 数据写入 Swap 空间,开机时从 Swap 恢复,因此需更大的 Swap 容量;服务器场景通常禁用 Hibernate,桌面 / 笔记本场景按需配置。
七、基于 LVM 的 Swap 空间扩容(实战案例)
7.1 分析现有 LVM 结构
[root@server ~ 16:49:44]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 145.1G 0 lvm /home
sr0 11:0 1 4.4G 0 rom
[root@server ~ 16:49:51]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <199.00g 4.00m
# sda2作为pv,使用剩余所有空间,归属卷组centos
# 在centos卷组中创建各种lv,提供不同的存储空间,例如/、/home、swap.
7.2 缩减 /home 逻辑卷释放空间(xfs 文件系统需重建)
前提:xfs 文件系统不支持在线缩减,需备份数据后卸载、重建
# 1. 备份/home目录数据
[root@server ~ 16:50:41]# mkdir /backup
[root@server ~ 16:51:06]# cp -a /home/liu/ /backup/
# 2. 卸载/home文件系统
[root@server ~ 16:51:52]# umount /home
# 3. 缩减home逻辑卷至46G(注意:缩减有数据丢失风险,需确认备份完成)
[root@server ~ 16:51:52]# lvreduce -L 46G /dev/centos/home
WARNING: Reducing active logical volume to 46.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce centos/home? [y/n]: y
Size of logical volume centos/home changed from <145.12 GiB (37150 extents) to 46.00 GiB (11776 extents).
Logical volume centos/home successfully resized.
# 4. 查看卷组空闲空间(释放的空间已回归centos卷组)
[root@server ~ 16:55:53]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <199.00g 99.12g
# 5. 重建xfs文件系统(-f强制覆盖)
[root@server ~ 16:56:09]# mkfs.xfs -f /dev/centos/home
meta-data=/dev/centos/home isize=512 agcount=4, agsize=3014656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=12058624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=5888, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# 6. 验证挂载配置并重新挂载
[root@server ~ 16:56:39]# grep home /etc/fstab
/dev/mapper/centos-home /home xfs defaults 0 0
[root@server ~ 16:57:28]# mount /home # 重新挂载
[root@server ~ 16:57:28]# df /home/ # 验证挂载结果
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-home 48210944 32992 48177952 1% /home
# 7. 恢复备份数据
[root@server ~ 16:57:35]# cp -a /backup/liu/ /home/
# 8. 验证用户登录(确认数据恢复正常)
[root@server ~ 16:58:10]# su - liu
[liu@server ~ 16:58:29]$
八、Swap 空间的创建与管理
8.1 创建 Swap 分区(基于新磁盘 /dev/sdb)
# 1. 创建GPT分区表
[root@server ~ 17:01:10]# parted /dev/sdb mklabel gpt
信息: You may need to update /etc/fstab.
# 2. 创建swap分区(1MiB起始,2049MiB结束,大小2048MiB=2GiB)
[root@server ~ 17:05:42]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 2049
信息: You may need to update /etc/fstab.
# 3. 验证分区创建结果
[root@server ~ 17:06:54]# parted /dev/sdb unit MiB print
Model: VMware, 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 swap01
# 4. 格式化swap分区(创建swap文件系统)
[root@server ~ 17:07:15]# mkswap /dev/sdb1
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=4194c1fb-347a-4509-a8c1-07cd4421133f
8.2 激活 Swap 空间
# 1. 临时激活swap分区(重启失效)
[root@server ~ 17:07:47]# swapon /dev/sdb1
# 2. 查看已激活的swap设备列表
[root@server ~ 17:08:12]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 4063228 0 -2
/dev/sdb1 partition 2097148 0 -3
# 3. 为swap分区设置优先级(-p指定优先级,范围-1~32767,值越大优先级越高)
[root@server ~ 17:10:10]# swapon -p 4 /dev/sdb1
# 说明:优先级相同时,系统按激活顺序使用swap;优先级不同时,优先使用高优先级swap
8.3 取消 Swap 空间激活
# 临时取消指定swap分区激活
[root@server ~ 17:10:14]# swapoff /dev/sdb1
# 验证取消结果
[root@server ~ 17:10:28]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 4063228 0 -2
8.4 持久化激活 Swap 空间(重启不失效)
# 1. 编辑/etc/fstab,添加swap分区配置(UUID替换为实际值,pri指定优先级)
echo "UUID=4194c1fb-347a-4509-a8c1-07cd4421133f swap swap pri=4 0 0" >> /etc/fstab
# 2. 激活/etc/fstab中所有swap设备
[root@server ~ 17:11:45]# swapon -a
# 3. 验证激活结果
[root@server ~ 17:11:50]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 4063228 0 -2
/dev/sdb1 partition 2097148 0 -3
# 4. 取消所有swap设备激活(可选)
[root@server ~ 17:12:23]# swapoff -a
更多推荐



所有评论(0)