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 读取数据遵循 “由快到慢” 的层级查找逻辑,具体流程如下:

  1. 优先从 CPU 寄存器读取数据;若未找到,则从 CPU Cache 读取,并将数据缓存至 CPU Cache。
  2. 若 CPU Cache 中存在目标数据,直接读取;若未找到,则从内存读取,并将数据缓存至内存。
  3. 若内存中存在目标数据,直接读取;若未找到,则从辅助存储器读取,并将数据缓存至内存。

三、物理内存与虚拟内存机制

3.1 物理内存的分页管理

系统将物理内存划分为固定大小的页(page),标准页大小为 4 KiB。进程无法直接寻址物理内存,而是通过虚拟地址空间(virtual address space) 访问内存。

内存管理单元(MMU,Memory Management Unit)负责将进程的虚拟地址(VA,Virtual Address)映射为物理地址(PA,Physical Address),MMU 是 CPU 中管理虚拟 / 物理存储器的核心控制线路,同时提供内存访问授权的硬件机制。

3.2 虚拟地址的核心价值(CPU 不直接访问物理地址的原因)

  1. 扩展内存容量:虚拟内存总容量 = 物理内存容量 + 交换空间容量,虚拟地址可映射至物理内存或交换空间地址。
  2. 保证内存连续性:进程运行时需连续的内存空间,若直接访问物理地址,内存碎片化会导致难以分配连续空间;而虚拟地址在虚拟内存中始终连续,MMU 可将其映射至离散的物理地址,满足进程对连续内存的需求。

四、Swap 空间核心概念

Linux Swap 空间是由内核内存子系统管理的磁盘区域,本质是 “磁盘模拟的虚拟内存”,功能与 Windows 虚拟内存(pagefile.sys)一致,核心作用是缓解物理内存不足的问题。

4.1 Swap 空间核心功能

  1. 内存超限时,将进程空闲的内存页写入 Swap 空间,释放物理内存分配给其他进程。
  2. 当程序需访问已写入磁盘的内存页时,内核将另一空闲内存页写入磁盘,再从 Swap 空间加载目标页至物理内存。
  3. 程序访问存储在 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 
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐