深入了解 Linux 的虚拟内存管理机制:Swap 机制

news/2025/1/23 22:47:53/

文章目录

  • 深入了解 Linux 的 Swap 机制
    • 一、什么是 Swap?
    • 二、Swap 的工作原理
    • 三、Swap 的类型
    • 四、Swap 的使用场景
    • 五、配置 Swap
    • 六、Swap 的性能影响
    • 七、如何优化 Swap 使用
    • 八、总结

深入了解 Linux 的 Swap 机制

  • 在 Linux 操作系统中,Swap 是一种虚拟内存管理机制,用于将暂时不需要的数据从物理内存(RAM)转移到磁盘上的交换空间,从而腾出更多的内存空间给活跃的进程使用。随着程序的运行,操作系统可能会面临内存不足的情况,此时 Swap 机制便派上用场,通过将部分内存内容移动到磁盘上,确保系统能够平稳运行。

一、什么是 Swap?

  • Swap 空间 是硬盘或固态硬盘(SSD)上专门用来扩展虚拟内存的区域。当物理内存不足时,操作系统会将一些内存页交换到磁盘上的 Swap 空间,以释放内存供其他进程使用。
  • Swap 是一种虚拟内存技术,它能够在物理内存不够用时,确保系统继续运行,但由于磁盘的读写速度远远低于内存,因此 Swap 空间的访问速度较慢。

二、Swap 的工作原理

  • 在 Linux 中,Swap 机制和虚拟内存紧密相连。操作系统使用虚拟内存来抽象化实际的物理内存,允许进程使用比物理内存更大的内存空间。当物理内存不足时,操作系统将采取以下步骤:
  1. 内存分页(Paging):操作系统将内存划分为多个固定大小的页面(通常是 4 KB)。这些页面可以是物理内存中的一部分,也可以是存储在 Swap 空间中的一部分。
  2. 页面交换:当物理内存使用完毕时,操作系统会选择将某些当前不活跃的内存页交换到磁盘的 Swap 空间。操作系统通常会基于某些算法,如最近最少使用(LRU,Least Recently Used),来决定哪些页面被交换到 Swap 区域。
  3. 将数据交换回内存:当某个进程再次需要被交换出去的内存页时,操作系统会将该页从 Swap 空间加载回物理内存中。此时,可能会再次发生 Swap 操作,将其他不活跃的页面交换到磁盘。

三、Swap 的类型

在 Linux 中,Swap 主要有两种形式:

  1. Swap 分区Swap 分区 是物理磁盘上一个专门分配出来的区域,通常格式化为 Linux 的交换文件系统(swapfs)。当系统需要使用 Swap 时,数据会直接写入这个分区。Swap 分区的一个优势是其性能较为稳定,且由于它是专门为交换内存而设计的,读写效率较高。
  2. Swap 文件:Linux 还支持通过 Swap 文件 来实现 Swap 机制。Swap 文件是存储在普通文件系统中的一个文件,通过该文件实现 Swap 功能。使用 Swap 文件的好处是灵活性更高,可以根据需要动态地增大或缩小 Swap 文件的大小,而不需要重新分区。

四、Swap 的使用场景

  1. 内存不足时的备用空间:当物理内存不足时,Swap 可以作为备用空间,让系统继续运行,而不会因为内存不足导致崩溃或停止响应。特别是在内存密集型应用或者大型服务器中,Swap 机制非常重要。
  2. 多任务处理:在进行多任务处理时,Linux 会将不活跃的进程的内存页移动到 Swap 中,以便腾出更多内存给当前正在执行的任务。这样,系统能够处理更多的进程而不会出现内存耗尽的情况。
  3. 节省物理内存:对于长时间运行但并不频繁访问的进程,Swap 提供了一个将不常用数据迁移到磁盘的方式,从而释放更多的物理内存给活跃进程。
  4. 系统性能优化:在一些大内存的应用场景中(例如虚拟机或容器),Swap 可以作为临时的扩展空间,使得系统能够处理比物理内存更多的数据,避免了物理内存的不足导致的系统停滞。

五、配置 Swap

  1. 查看当前 Swap 设置
    使用 swaponfree 命令可以查看当前系统的 Swap 状况。
    swapon --show
    free -h
    
root@hcss-ecs-ec6a:~# free -htotal        used        free      shared  buff/cache   available
Mem:           3.6Gi       1.0Gi       242Mi       5.0Mi       2.4Gi       2.3Gi
Swap:             0B          0B          0B
  1. 创建 Swap 分区:如果想为系统添加一个新的 Swap 分区,可以使用 fdiskparted 工具来创建新的分区,然后用 mkswap 命令格式化它。

    sudo fdisk /dev/sda
    sudo mkswap /dev/sdaX
    sudo swapon /dev/sdaX
    
  2. 创建 Swap 文件:使用 dd 命令创建一个 Swap 文件,然后通过 mkswap 格式化,并启用它。

    sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  3. 配置开机自动挂载:在 /etc/fstab 文件中添加对应的 Swap 设备或文件,以便开机时自动挂载。

    /swapfile none swap sw 0 0
    

六、Swap 的性能影响

虽然 Swap 机制可以保证系统在内存不足时的稳定性,但由于磁盘的读写速度远远低于内存,因此频繁的 Swap 操作会对性能产生影响。

  1. 性能下降
    当系统频繁使用 Swap 时,特别是当物理内存和 Swap 空间之间的数据交换过于频繁时,系统的响应速度会显著下降,导致“磁盘抖动”现象,也就是俗称的 “Thrashing”。
  2. Swap 和 SSD
    使用传统硬盘(HDD)作为 Swap 存储介质时,访问速度较慢,会导致系统性能明显下降。然而,随着固态硬盘(SSD)的普及,Swap 的性能有所提高,但即便如此,Swap 的性能仍然无法与 RAM 相比。

七、如何优化 Swap 使用

  1. 调整 swappiness 参数swappiness 是一个控制 Linux 使用 Swap 的策略参数。它的值介于 0 和 100 之间,决定了内存使用的策略。值越低,系统越倾向于保留数据在内存中,越高则倾向于使用 Swap。
    查看当前 swappiness 值:

    cat /proc/sys/vm/swappiness
    

    设置 swappiness 值:

    sudo sysctl vm.swappiness=10
    

    通过设置较低的 swappiness 值(例如 10),可以减少 Swap 使用,优先使用物理内存。

  2. 增加物理内存:最直接的方法就是增加物理内存(RAM)。通过增加 RAM 可以减少 Swap 的使用频率,降低 Swap 机制对性能的影响。

  3. 使用较快的磁盘作为 Swap:如果无法增加物理内存,可以考虑使用 SSD 来做 Swap 区域,因 SSD 的读写速度比传统硬盘快得多,能显著提高 Swap 的性能。

  4. 监控 Swap 使用情况:使用 vmstattophtop 等工具实时监控 Swap 的使用情况,以便及时发现是否存在频繁 Swap 的现象。

八、总结

  • Swap 是 Linux 中重要的虚拟内存管理机制,它通过将不活跃的内存数据转移到磁盘,确保系统在内存不足时仍能稳定运行。然而,频繁的 Swap 操作会影响系统性能,因此合理配置 Swap 空间、调整 swappiness 参数以及使用快速的磁盘存储是优化 Swap 使用的关键。

http://www.ppmy.cn/news/1565600.html

相关文章

十一、apply家族(4)

tapply()函数 tapply()函数主要是用于对一个因子或因子列表,执行指定的函数调用,最后获得汇总信息。 tapply()函数的使用格式如下所示。 tapply(x, INDEX, FUN, ...&am…

centos 安全配置基线

CentOS 是一个广泛使用的操作系统,为了确保系统的安全性,需要遵循一系列的安全基线。以下是详细的 CentOS 安全基线配置建议: 通过配置核查,CentOS操作系统未安装入侵防护软件,无法检测到对重要节点进行入侵的 解决方案: 安装入侵…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组, 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn, 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

【jmeter】下载及使用教程【mac】

1.安装java 打开 Java 官方下载网站https://www.oracle.com/java/technologies/downloads/选择您想要下载的 Java 版本,下载以 .dmg 结尾的安装包,注意 JMeter 需要 Java 8下载后打开安装包点击“安装”按钮即可 2.下载jmeter 打开 Apache JMeter 官方…

selenium获取登录token

背景 新到一个需求需要用爬虫采集数据,但这个采购的系统登录做了加密,我也懒得研究前端代码了,于是考虑用selenium来获取用户token做处理。 下载webdriver 由于我开发机器使用的chorme,因此下载的chorme webdriver,…

Mysql面试题----为什么B+树比B树更适合实现数据库索引

数据存储结构 B 树:每个节点既存储键值,也存储数据记录的指针。这种存储方式使得每个节点存储的键值数量相对较少,因为还要为指针留出空间。当数据量较大时,树的高度会相对较高,导致查询时需要更多的磁盘 I/O 操作来遍…

Django项目的创建及运行——Django学习日志(一)

1.命令行创建 (1)创建项目 django-admin startproject HelloWorld(这里的名称任意) (2)创建应用(app) 首先要进入到项目目录,比如我这里的项目目录为HelloWorld cd …

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…