Linux 交换空间管理摘要本文全面介绍了 Linux 系统中的交换空间Swap管理。首先从计算机存储器的层次结构和工作原理入手解释了物理内存与虚拟内存的关系。然后详细阐述了 Swap 空间的功能、大小规划原则并通过实际案例演示了如何查看系统内存使用情况、分析 LVM 结构、创建和配置交换分区。文章包含完整的命令行操作步骤涵盖交换空间的创建、格式化、激活、优先级设置以及持久化配置为系统管理员提供了实用的 Swap 管理指南。1.计算机存储器的层次结构计算机存储器速度越快成本较高。 为了获得好的性能/价格比计算机中各种存储器组成一个层状的塔式结构取长补短协调工作。CPU 寄存器是 CPU 内部用来存放数据的一些小型存储区域用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。• CPU 高速缓存也就是CPU Cache是一种容量小、速度快的高缓冲存储器由SRAM组成直接制作在CPU芯片内速度几乎与CPU一样快。在金字塔式存储体系中它位于自顶向下的第二层仅次于CPU寄存器。其容量远小于内存但速度却可以接近处理器的频率。• 主存储器Main memory简称主存或内存其作用是存放指令和数据并能由中央处理器CPU直接随机存取。主存储器速度比CPU高速缓存慢但存储容器却大的多。主存储器的速度一般用存取时间衡量即每次与CPU间数据处理耗费的时间以纳秒(ns)为单位。大多数SDRAM内存芯片的存取时间为5、6、7、8或10ns。主存储器的带宽计算公式带宽频率*位宽8。例如DDR4 内存频率是3600 MHz在64位系统双通道位宽为128以此类推1B8bit,• 单通道 DDR4-36003600MHz * 64bit / 828800MB/S• 双通道 DDR4-36003600MHz * 64bit * 2 / 857600MB/S• 辅助存储器速度慢的多优点是容量大可持久化存储。2.计算机存储器的工作原理1.CPU运行程序时先从寄存器中读取数据。如果在寄存器中可以找到数据则直接从寄存器中读取。如果在寄存器中找不到数据则从CPU Cache中读取数据并将数据缓存在CPU Cache中。2.如果在CPU cache中可以找到数据则直接从CPU Cache中读取。如果在CPU cache中找不到数据则从主存储器内存中读取数据将数据缓存在主存储器中。3.如果在内存中可以找到数据则直接从内存中读取。如果在内存中找不到数据则从辅助存储器中读取数据例如机械磁盘、光盘、U盘等并将数据缓存在内存中。3.物理内存计算机系统将内存划分为固定大小的块称为 page标准 page 大小为 4 KiB。进程并不直接对物理内存寻址每个进程具有虚拟地址空间virtual address space。当进程请求内存时MMU 将进程获得的虚拟地址VAVirtual Address 映射到物理地址PAPhysical Address 。MMU是Memory Management Unit的缩写即内存管理单元它是CPU中用来管理虚拟存储器、物理存储器的控制线路负责将虚拟地址映射为物理地址以及提供硬件机制的内存访问授权。思考为什么CPU不直接访问物理地址1.虚拟内存的容量是物理内存和交换空间的总和而虚拟地址负责映射到物理内存地址和交换空间地址。2.进程使用内存的过程中希望内存是连续的。如果进程直接访问物理地址则内核很难保证进程获得的物理地址空间是连续的因为进程存在着运行和退出就会出现内存碎片化。进程的虚拟地址在虚拟内存中是连续的达到了内存连续的目的而 MMU 会将进程的虚拟地址映射到物理地址。4.Swap 空间Swap意思是“交换”、“实物交易”。Linux Swap交换空间是受Linux内核内存子系统控制的磁盘区域。• 功能1当内存使用量超过定义的限制时内核寻找已分配给进程但空闲的内存页将该空闲的内存页写入到交换空间并向其他进程重新分配RAM页面。• 功能2如果某个程序需要访问磁盘上的页面则内核会找到另一个空闲的内存页 将其写入到磁盘然后从交换区重新调用所需的页面。• 功能3如果某个程序需要访问数据访问的数据存放在交换空间则该程序直接从交换空间读取数据而不需要从磁盘原始位置读取进而提高速度。简单地说Linux Swap 空间就是在内存不够的情况下操作系统先把内存中暂时不用的数据存到硬盘的交换空间腾出内存来让别的程序运行和Windows的虚拟内存pagefile.sys的作用是一样的。交换空间只是临时的解决办法。虽然交换空间能够作为虚拟内存使用但由于交换区位于磁盘上它的速度比物理内存慢的多因此如果需要更快的速度的话最好的办法仍然是加大物理内存。(1)查看内存# 默认单位是KiB使用-m选项以MiB为单位[rootserver ~12:27:08]# freetotal usedfreeshared buff/cache available Mem:40261161558243764960118481053323691072Swap:406322804063228输出说明• Mem• total物理内存空间大小。• used使用的内存 (total - free - buffers - cache)。• free未使用的内存空间大小(真正的空闲未被任何程序占用)。• shared多个进程共享的内存空间大小。• cached从磁盘读取的数据占用的内存空间大小待以后使用数据没有被修改。• buffers被更改但未写回磁盘的数据占用的内存空间大小。• Swap:• total交换空间大小。• used使用的交换空间大小。• free未使用交换空间大小。(2)Swap 空间大小管理员应根据系统的内存工作负载来调整交换空间大小。 应用供应商有时会提供这方面的建议。根据物理内存总量下表提供了一些指导。物理内存(RAM)交换空间允许HIBERNATE时的交换空间2GiB或以下两倍的RAM三倍的RAM2GiB和8GiB之间同等的RAM两倍的RAM8GiB和64GiB之间至少4GiB1.5倍的RAM64GiB以上至少4GiB不建议Hibernate笔记本电脑和台式机的Hibernate功能会在关闭系统电源之前使用交换空间来保存RAM内容。重新打开系统时 内核将从交换空间恢复RAM内容无需完全启动。 对于这些系统而言交换空间需要超过RAM量。(3)插播分析操作系统自带的 LVM 结构[rootserver ~12:27:23]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda8:00100G0disk ├─sda18:101G0part /boot └─sda28:2099G0part ├─centos-root253:0050G0lvm / ├─centos-swap253:103.9G0lvm[SWAP]└─centos-home253:2045.1G0lvm /home sr011:014.4G0rom[rootserver ~12:31:15]# pvsPV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a--99.00g4.00m# sda2作为pv使用剩余所有空间归属卷组centos# 在centos卷组中创建各种lv提供不同的存储空间例如/、/home、swap.思考如何从centos卷组中分配4G空间出来给新的swap使用[rootserver ~12:31:18]# df -hT |grep -v tmpfs文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 50G1.6G 49G4% / /dev/mapper/centos-home xfs 46G 33M 46G1% /home /dev/sda1 xfs 1014M 139M 876M14% /boot发现/home文件系统系统空间很大但是使用空间非常少。缩减/home空间给其他应用使用。/home文件系统是xfs不支持缩减。可以备份数据后再缩减空间。# 备份数据[rootserver ~12:38:46]# mkdir /backup[rootserver ~12:45:07]# cp -a /home/lz/ /backup/# 缩减逻辑卷[rootserver ~12:45:30]# umount /home#[rootserver ~12:49:29]# lvreduce -L 4G /dev/centos/homeWARNING: Reducing active logical volume to4.00GiB. 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 from45.12GiB(11550extents)to4.00GiB(1024extents). Logical volume centos/home successfully resized.# 空间释放到卷组中[rootserver ~12:49:55]# vgsVG#PV #LV #SN Attr VSize VFreecentos130wz--n-99.00g41.12g# 重新格式化并挂载[rootserver ~12:50:00]# mkfs.xfs -f /dev/centos/homemeta-data/dev/centos/homeisize512agcount4,agsize262144blkssectsz512attr2,projid32bit1crc1finobt0,sparse0databsize4096blocks1048576,imaxpct25sunit0swidth0blks namingversion2bsize4096ascii-ci0ftype1loginternal logbsize4096blocks2560,version2sectsz512sunit0blks, lazy-count1realtimenoneextsz4096blocks0,rtextents0[rootserver ~12:52:50]# grep home /etc/fstab/dev/mapper/centos-home /home xfs defaults00[rootserver ~12:53:02]# mount -a[rootserver ~12:53:14]# df /home/文件系统 1K-块 已用 可用 已用% 挂载点 /dev/mapper/centos-home41840643299241510721% /home# 恢复数据[rootserver ~12:53:19]# cp -a /backup/lz/ /home/# 验证用户登录[rootserver ~12:55:15]# su - lz上一次登录三5月1314:14:05 CST2026从10.1.8.1pts/0 上[lzserver ~12:55:20]$exit登出(4)创建交换空间# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap[rootserver ~13:00:59]# parted /dev/sdb mklabel gpt信息: You may need to update /etc/fstab.[rootserver ~13:01:04]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 2049信息: You may need to update /etc/fstab.[rootserver ~13:01:26]# parted /dev/sdb unit MiB printModel: VMware, VMware Virtual S(scsi)Disk /dev/sdb: 102400MiB Sector size(logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name 标志11.00MiB 2049MiB 2048MiB swap01# 格式化swap空间[rootserver ~13:01:33]# mkswap /dev/sdb1正在设置交换空间版本1大小2097148KiB 无标签UUID98fb6caa-a091-455f-8159-211938c77abb(5)激活 swap 空间# 激活swap空间[rootserver ~13:01:44]# swapon /dev/sdb1# 查看swap设备列表[rootserver ~13:01:55]# swapon -s文件名 类型 大小 已用 权限 /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3默认情况下多个交换空间具有相同的优先级时系统会按顺序使用交换空间即内核先使用第一个已激活交换空间直至其空间已满然后开始使用第二个交换空间。在激活交换分区的时候可以为每个交换空间定义一个优先级从而强制按该顺序使用交换空间。swapon 命令使用-p选项指定优先级优先级介于-1和32767之间值越大优先级越高。示例[rootserver ~13:02:04]# swapon -p 4 /dev/sdb1(6)取消 swap 空间激活[rootserver ~13:02:39]# swapoff /dev/sdb1[rootserver ~13:07:21]# swapon -s文件名 类型 大小 已用 权限 /dev/dm-1 partition40632280-2(7)持久化激活 swap 空间修改/etc/fstab文件添加如下类似记录UUID98fb6caa-a091-455f-8159-211938c77abb swap swappri400使用命令swapon -a激活/etc/fstab中所有交换设备。使用命令swapoff -a取消/etc/fstab中所有交换设备激活。[rootserver ~13:10:28]# swapon -a[rootserver ~13:10:38]# swapon -s文件名 类型 大小 已用 权限 /dev/dm-1 partition40632280-2/dev/sdb1 partition209714804[rootserver ~13:10:43]# swapoff -a[rootserver ~13:11:07]# swapon -s