Linux深入理解内存管理40

Linux深入理解内存管理40(基于Linux6.6)---swap分区介绍


一、什么是swap

swap主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。当内存使用存在压力的时候,开始触发内存回收行为,就可能会使用swap空间。Swap 把这些不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用。再次访问这些内存时,重新从磁盘读入内存就可以了,其原理如下图所示:

Swap就是把一块磁盘空间或者本地文件,当成内存来使用,它包含换出和换入两个过程:

  • 所谓换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
  • 而换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。

常见的笔记本电脑的休眠和快速开机的功能,也基于 Swap 。休眠时,把系统的内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以。这样就省去了很多应用程序的初始化过程,加快了开机速度。

Linux提供两种不同的方法启用Swapping,分别是 Swap 分区(Swap Partition)和 Swap 文件(Swapfile):

  • Swap 分区是硬盘上的独立区域,该区域只会用于交换分区,其他的文件不能存储在该区域上,我们可以使用 swapon -s 命令查看当前系统上的交换分区;

 

Swap 文件是文件系统中的特殊文件,它与文件系统中的其他文件也没有太多的区别;

1、swap 分区的工作原理

  1. 内存不足时的交换

    • 当系统的物理内存(RAM)使用完时,Linux 内核会将一些不常用的内存页写入 swap 分区,释放出物理内存给当前正在使用的进程。
    • 换出的内存页会被存储在 swap 分区中,当这些数据需要再次使用时,它们会被从 swap 中读回到物理内存(称为换入,swap in)。
  2. 性能影响

    • 使用 swap 的时候,由于硬盘的读取和写入速度比内存要慢得多,因此频繁地将数据写入 swap 会导致系统性能下降。尤其是在硬盘为传统的机械硬盘(HDD)时,性能的差距尤为明显。
    • 使用固态硬盘(SSD)作为 swap 的介质,虽然比传统硬盘快,但仍然无法与物理内存的速度相比,因此应尽量避免频繁使用 swap。

2、swap 的类型

  1. swap 分区

    • 传统的 swap 存储介质为独立的磁盘分区,通常使用 mkswap 命令进行格式化并启用。例如,/dev/sda2 可能是一个 swap 分区。
  2. swap 文件

    • 除了使用专用的 swap 分区,还可以使用普通文件作为 swap 存储。创建 swap 文件的方法是先创建一个大小合适的文件,并使用 mkswap 命令格式化它,最后通过 swapon 启用。例如,/swapfile 可能是一个 swap 文件。

3、swap 分区的大小

在 Linux 系统中,swap 分区的大小通常取决于以下因素:

  • 物理内存(RAM)大小:传统上,swap 的推荐大小通常为物理内存的 1x 到 2x,但现代系统中的 RAM 越来越大,通常不需要这么大的 swap。

    • 对于 4GB 或更小的内存,swap 大小通常设置为 1-2 倍的 RAM 大小。
    • 对于 8GB 或更大的内存,通常设置为与 RAM 大小相同,或者甚至不需要使用 swap。
  • 使用场景:如果系统需要大量的内存进行缓存、虚拟化等任务,可以考虑增加 swap 大小。

二、为什么需要swap

  • 内存不足:当系统需要的内存超过了可用的物理内存时,内核会将内存中不常使用的内存页交换到磁盘上为当前进程让出内存,保证正在执行的进程的可用性,这个内存回收的过程是强制的直接内存回收(Direct Page Reclaim)。
  • 内存闲置:应用程序在启动阶段使用的大量内存在启动后往往都不会使用,通过后台运行的守护进程,我们可以将这部分只使用一次的内存交换到磁盘上为其他内存的申请预留空间。kswapd 是 Linux 负责页面置换(Page replacement)的守护进程,它也是负责交换闲置内存的主要进程,它会在空闲内存低于一定水位时,回收内存页中的空闲内存保证系统中的其他进程可以尽快获得申请的内存。

很多人认为当系统内存不足时应该立即触发内存不足(Out of memory、OOM)并杀掉进程,但是 Swapping 其实为系统管理员提供了另外一种选择,利用磁盘的交换空间避免程序被直接退出,以降低服务质量的代价换取服务的部分可用性。Linux 中的 Swapping 机制主要是为内存不足和内存闲置两种常见的情况存在的。

  • Swapping 可以直接将进程中使用相对较少的页面换出内存:当系统需要的内存超过了可用的物理内存时,内核会将内存中不常使用的内存页交换到磁盘上为当前进程让出内存,保证正在执行的进程的可用性;
  • Swapping 可以将进程中的闲置页面换出内存:应用程序在启动阶段使用的大量内存在启动后往往都不会使用,通过后台运行的守护进程,我们可以将这部分只使用一次的内存交换到磁盘上为其他内存申请预留空间

以下是使用 swap 的几个主要原因:

1. 扩展虚拟内存

在计算机系统中,内存(RAM)是有限的。当系统中运行的程序和进程所需的内存超过物理内存的大小时,操作系统就会将一些不常用的数据或进程状态转移到硬盘上的 swap 区域,确保系统能够继续运行。这种机制让系统的虚拟内存容量大大超过物理内存的大小,从而避免因内存不足而导致的程序崩溃或系统挂起。

2. 提升系统稳定性

没有 swap 的话,当物理内存用尽时,操作系统就无法分配足够的内存给新的或正在运行的程序,这可能导致程序崩溃或整个系统冻结。通过使用 swap,操作系统可以通过交换将一些不常用的数据移到磁盘上,防止程序和系统因内存不足而直接崩溃,从而提升系统的稳定性。

3. 支持内存过载时的内存需求

一些程序可能会瞬间需要大量的内存,例如大型数据处理任务、复杂的科学计算、虚拟化应用等。如果这些程序运行时,物理内存无法满足需求,swap 可以为这些进程提供临时内存空间。这使得系统能够处理更多的任务,尽管这可能会导致性能下降。

4. 优化内存的使用效率

系统会根据实际情况判断哪些内存页(内存中存储的数据)是较少使用的,并将这些页移到 swap 中,从而释放物理内存给当前正在频繁使用的程序。通过这种方式,操作系统能够优化内存使用,并提高系统的响应性。

5. 提高多任务处理能力

当系统需要同时运行多个程序或处理多个任务时,内存资源可能会紧张。Swap 可以作为一种备用资源,在物理内存已被占满的情况下,确保其他任务能够继续执行,避免系统因为内存不够用而停止新任务的运行。

6. 允许休眠或挂起模式

在一些桌面系统中,swap 也用于实现休眠(hibernate)功能。当计算机休眠时,系统会将整个内存的内容(包括所有打开的应用程序和数据)保存到 swap 分区中,这样下次开机时可以恢复到休眠前的状态。如果没有 swap,系统就无法实现休眠功能。

7. 节省硬件成本

在物理内存较为昂贵或不足的情况下,通过使用 swap 可以避免过度购买和安装额外的 RAM。虽然使用 swap 会导致性能上的下降(因为硬盘的速度远慢于 RAM),但它可以在一定程度上降低硬件成本,尤其是对于一些内存需求不高的场合。

三、Swap分区空间什么时候使用

系统在什么情况或条件下才会使用Swap分区的空间呢? /proc/sys/vm/swappiness这个文件,是个可以用来调整跟swap相关的参数。这个文件的默认值是60,可以的取值范围是0-100。

这个参数值,控制系统 swap 的使用程度。高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值为 60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。

  • 这个文件的值用来定义内核使用swap的积极程度。值越高,内核就会越积极的使用swap,值越低就会降低对swap的使用积极性。如果这个值为0,那么内存在free和file-backed使用的页面总量小于高水位标记(high water mark)之前,不会发生交换。
  • swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

目前默认值为60,也就是说内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

具体来说,swap分区在以下几种情况中会被使用:

1. 物理内存(RAM)不足时

当系统中的物理内存被占满,且新的进程需要更多的内存时,操作系统会将一些当前不常用的内存页(页面)移到swap分区。这是一种虚拟内存扩展机制,可以避免因为内存不足而导致程序崩溃或系统挂起。

  • 情况:如果运行多个大型应用程序、进行数据密集型操作、或者同时开启许多程序,内存可能会耗尽,此时操作系统会开始使用swap分区来存放不活跃的进程数据。
  • 举例:比如你在编辑大型文档、同时运行多个浏览器标签页、打开多个视频文件等,如果物理内存不足,操作系统就会将不常用的进程数据转移到swap分区。

2. 内存溢出或高内存负载时

在系统负载较高、内存资源被大量占用的情况下,即使物理内存尚未完全耗尽,系统可能会主动使用swap以优化内存使用和避免内存碎片化。某些情况下,操作系统可能会提前将一部分内存数据转移到swap分区,从而保持更多的内存空间供高优先级进程使用。

  • 情况:系统正在运行的进程数很多,或者有一些进程消耗大量内存(比如虚拟机、数据库等),即使物理内存没有完全用尽,操作系统也可能会将一些数据移到swap中,以便留更多内存给当前正在运行的关键进程。

3. 休眠模式(Hibernate)时

当计算机进入休眠状态时,系统会将整个内存的内容保存到swap分区(或其他指定的休眠文件中),以便下次开机时恢复到休眠前的状态。休眠模式常见于笔记本电脑等移动设备。

  • 情况:如果你将电脑进入休眠模式,操作系统会把所有内存中的数据(如打开的程序、文件等)保存到swap分区,然后关闭系统。当你重新启动电脑时,系统会将swap中的内容加载回内存,恢复到你上次使用时的状态。

4. 低优先级进程的内存交换

操作系统通常会根据进程的优先级来决定哪些数据应该交换到swap分区。低优先级的进程(比如后台任务、长时间不活跃的应用程序等)通常会被选中,将它们的内存数据移动到swap区域,而将更多的物理内存留给前台活跃进程。

  • 情况:例如你正在使用一个文字处理软件并编辑重要文件,同时背景中有多个下载任务和系统更新。在这种情况下,系统可能会将一些低优先级的下载任务数据交换到swap,而将更多内存分配给当前活跃的文字处理软件。

5. 高内存需求时进行的临时存储

某些程序或操作可能会短期内占用大量内存,比如处理大文件或运行内存密集型的应用(如视频编辑、科学计算、3D建模等)。如果物理内存不足,系统会使用swap分区来临时存储部分数据,直到内存资源恢复为止。

  • 情况:例如,你在进行大型数据分析,程序需要大量内存来存储和处理数据。当物理内存不足时,操作系统会将不常用的数据移到swap分区,等内存足够时再将数据移回。

 四、Swap的含义

在使用多个swap分区或者文件的时候,还有一个优先级的概念(Priority)。在swapon的时候,可以使用-p参数指定相关swap空间的优先级,值越大优先级越高,可以指定的数字范围是-1到32767。内核在使用swap空间的时候总是先使用优先级高的空间,后使用优先级低的。当然如果把多个swap空间的优先级设置成一样的,那么两个swap空间将会以轮询方式并行进行使用。如果两个swap放在两个不同的硬盘上,相同的优先级可以起到类似RAID0的效果,增大swap的读写效率。另外,编程时使用mlock()也可以将指定的内存标记为不会换出,具体帮助可以参考man 2 mlock。

1、Swap的优先级(Priority)

当系统配置了多个 swap 设备或文件时,操作系统需要知道如何选择不同的 swap 空间来进行内存交换。为了管理多个 swap 设备或文件的使用,系统引入了 优先级priority)的概念。优先级决定了操作系统在进行内存交换时,选择哪个 swap 空间。优先级的值越大,系统会优先使用该 swap 空间。

2、优先级的值范围

  • 范围priority 的值可以在 -1 到 32767 之间。
    • 负数优先级:值为负数时,表示该 swap 空间的优先级较低,系统不太倾向于使用它。
    • 正数优先级:值为正数时,表示该 swap 空间的优先级较高,系统倾向于优先使用它。

3、如何设置 Swap 优先级

在启用 swap 时,您可以通过 swapon 命令的 -p 参数来指定 swap 空间的优先级。例如:

swapon -p 100 /dev/sda2

这会将 /dev/sda2 设备设置为优先级为 100 的 swap 空间。

4、swap空间优先级的工作原理

  1. 多个 swap 空间的管理

    • 如果系统有多个 swap 分区或文件,内核会根据每个分区或文件的优先级来决定使用哪一个。优先级越高的 swap 空间会先被使用。
    • 优先级较低的 swap 空间只有在优先级较高的空间用尽或系统认为不再需要时,才会被启用。
  2. 动态调整

    • Linux 系统会动态调整 swap 空间的使用。如果系统负载较高,可能会先使用优先级较高的 swap 空间,以保证高效的内存管理。
    • 如果多个 swap 空间的优先级相同,系统会按照它们被启用的顺序来选择使用哪个。
  3. 负数优先级

    • 使用负数优先级的 swap 空间通常是备用的 swap 分区,只有在其他空间用尽时才会启用。负数优先级的空间不会是默认的交换空间。

示例

假设系统上有两个 swap 空间,一个是硬盘上的 swap 分区,另一个是一个 swap 文件。您希望硬盘上的 swap 分区有更高的优先级,因此可以使用如下命令:

  • 启用第一个 swap 分区,优先级为 100:

  • swapon -p 100 /dev/sda2
    
  • 启用第二个 swap 文件,优先级为 50:

  • swapon -p 50 /swapfile
    

这样,系统会首先使用 /dev/sda2 分区作为交换空间,只有在该分区满了或不可用时,才会使用 /swapfile 作为后备交换空间。

5、默认优先级

如果在启用 swap 时没有指定优先级,系统会使用默认值,通常为 0。因此,若没有特别指定,所有 swap 空间的优先级都会相同,系统会根据它们的启用顺序来决定使用哪个空间。

6、查看当前 Swap 配置

可以使用 swapon -s 命令来查看当前系统的 swap 配置及其优先级:

swapon -s

输出示例:

Filename                                Type            Size    Used    Priority
/dev/sda2                               partition       2048M   512M    100
/swapfile                                file            1024M   0M      50

在这个例子中,/dev/sda2 是优先级为 100 的 swap 设备,而 /swapfile 是优先级为 50 的 swap 文件。

 五、Swap交换分区对性能的影响

Linux可以使用文件系统中的一个常规文件或独立分区作为Swap交换空间,相对而言,交换分区要快一些。但是和RAM比较而言,Swap交换分区的性能依然比不上物理内存,目前的服务器上RAM基本上都相当充足,那么是否可以考虑抛弃Swap交换分区,是否不需要保留Swap交换分区呢?

  • 当物理内存不足以支撑系统和应用程序(进程)的运作时,这个Swap交换分区可以用作临时存放使用率不高的内存分页,把腾出的内存交给急需的应用程序(进程)使用。有点类似机房的UPS系统,虽然正常情况下不需要使用,但是异常情况下, Swap交换分区还是会发挥其关键作用。
  • 即使你的服务器拥有足够多的物理内存,也有一些程序会在它们初始化时残留的极少再用到的内存分页内容转移到 swap 空间,以此让出物理内存空间。对于有发生内存泄漏几率的应用程序(进程),Swap交换分区更是重要,因为谁也不想看到由于物理内存不足导致系统崩溃。
  • 现在很多个人用户在使用Linux,有些甚至是PC的虚拟机上跑Linux系统,此时可能常用到休眠(Hibernate),这种情况下也是推荐划分Swap交换分区的。

其实少量使用Swap交换空间是不会影响性能,只有当RAM资源出现瓶颈或者内存泄露,进程异常时导致频繁、大量使用交换分区才会导致严重性能问题。另外使用Swap交换分区频繁,还会引起kswapd0进程(虚拟内存管理中, 负责换页的)耗用大量CPU资源,导致CPU飙升。

在 Linux 系统中,swap(交换分区)用于扩展系统的虚拟内存。当物理内存(RAM)不足时,操作系统会将一些暂时不活跃的内存页(即进程的数据)写入 swap 空间,从而释放物理内存供正在运行的程序使用。然而,swap 的使用对系统性能的影响是非常显著的,特别是当频繁访问 swap 时,系统的响应速度和整体性能可能会大幅下降。具体的影响可以从以下几个方面来探讨:

1. 磁盘速度与内存速度的差异

  • 内存(RAM) 的速度是硬盘的数百倍甚至上千倍。当内存不足时,操作系统将数据移到 swap 空间,如果 swap 空间在硬盘上,读取和写入数据时的速度要比内存慢得多。即便是固态硬盘(SSD)的速度也无法与内存相提并论,因此频繁的交换操作会显著降低系统性能。

  • 如果系统需要频繁从 swap 读取数据,应用程序的响应时间会变长,造成明显的性能瓶颈,尤其是在内存使用量较大或需要高响应时间的应用场景下(如数据库、虚拟化等)。

2. Swap空间的使用对 CPU 资源的消耗

  • 当系统交换内存时,它不仅涉及到磁盘的 I/O 操作,还会消耗 CPU 资源,因为操作系统需要管理页表、数据交换的过程。频繁的 swap 操作会导致 CPU 的额外负担,进而影响到其他进程的执行效率。

  • 例如,当系统的物理内存被耗尽时,操作系统必须决定哪些数据应该写入磁盘,哪些数据应该从磁盘读取回来,这一过程会占用大量 CPU 资源,导致 CPU 的使用率上升,甚至出现系统卡顿。

3. Swap对系统响应时间的影响

  • 在内存不足的情况下,系统开始使用 swap 时,用户和程序的响应时间可能会变得非常缓慢。这是因为,内存访问的速度比磁盘(即使是 SSD)要快得多。对于对实时性要求高的应用(如游戏、实时数据处理等),使用 swap 可能会导致非常明显的性能下降,出现卡顿或延迟。

  • 使用 swap 后,系统需要在磁盘和内存之间频繁交换数据,进程可能会由于等待数据而被暂停,从而导致整个系统变得不流畅。

4. 写入操作对SSD的影响

  • 对于现代的固态硬盘(SSD),频繁的写入操作可能会加速磁盘的磨损。虽然现代 SSD 采用了写入均衡算法(wear leveling)来减轻这种影响,但如果系统频繁使用 swap 文件或交换分区,仍然会增加 SSD 的写入负担,影响其长期的可靠性。

5. 系统的总体性能

  • 在多任务处理或内存密集型应用的环境中,如果物理内存不足而频繁使用 swap,整个系统的性能可能会大幅下降。尤其在服务器环境中,低效的内存管理和过度依赖 swap 会导致响应延迟增加,甚至出现应用崩溃、系统崩溃的情况。

  • 例如,在高并发场景中,数据库等应用可能需要大量内存来进行数据缓存和查询。如果系统频繁依赖 swap,可能导致查询响应时间显著增加,最终影响用户体验和业务服务的稳定性。

6. 如何优化 Swap 使用与性能

为了尽量减少 swap 对系统性能的负面影响,可以采取以下几种措施:

(1) 合理配置 swap 空间大小

  • 过多的 swap 空间并不意味着系统性能会更好。过大的 swap 空间可能让操作系统觉得可以依赖于 swap,导致不必要的交换操作。因此,应该根据实际需求来配置适当大小的 swap 空间。一般来说,物理内存的大小与 swap 空间的大小保持一定的比例(例如,swap 空间大小为物理内存的 1.5 到 2 倍),但这并不是固定的,具体配置要根据实际工作负载来调整。

(2) 优先使用高速存储设备

  • 如果必须使用 swap,确保 swap 空间配置在 SSD 上,而不是传统的机械硬盘(HDD)。SSD 的访问速度显著高于 HDD,可以一定程度上缓解 swap 带来的性能瓶颈。

(3) 增加物理内存

  • 最根本的解决办法是 增加物理内存。通过增加内存,减少 swap 的使用频率,从而提高系统的整体性能。如果服务器或工作站需要频繁使用 swap,那就意味着物理内存可能不足,应考虑扩充内存。

(4) 调整 swapiness 值

  • swappiness 是 Linux 系统中的一个参数,用来控制内核在什么情况下开始使用 swap 空间。该值的范围是 0 到 100,默认值通常为 60。一个较高的 swappiness 值意味着系统会更早开始使用 swap,而较低的值则表示系统会尽量保留物理内存,避免使用 swap。

    • 调整 swappiness 值,降低 swap 使用的频率,增加对物理内存的依赖,可以通过如下命令调整:
sysctl vm.swappiness=10

这将 swappiness 设置为 10,意味着系统会尽量避免频繁使用 swap。

(5) 优化内存使用的程序和服务

  • 优化程序和服务的内存使用,减少内存泄漏、优化代码,或者使用更高效的数据结构,可以降低对 swap 的依赖。 

六、总结

关于swap的使用,针对不同负载状态的系统是不一样的。有时希望swap大一些,可以在内存不够用的时候不至于触发oom-killer导致某些关键进程被杀掉,比如数据库业务。也有时候希望不要swap,因为当大量进程爆发增长导致内存爆掉之后,会因为swap导致IO跑死,整个系统都卡住,无法登录,无法处理。这时候就希望不要swap,即使出现oom-killer也造成不了太大影响,但是不能允许服务器因为IO卡死像多米诺骨牌一样全部死机,而且无法登陆。跑cpu运算的无状态的apache就是类似这样的进程池架构的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值