「Linux」SWAP 深度解读

作者 : 开心源码 本文共1267个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共202人阅读

概述

本文探讨的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的解决逻辑。主要是:swap、swappiness及kswapd原理,swap分区优先级的妙用。

处理以下问题:

1、 swap究竟是干嘛的?

2、 什么是内存水位标记?

3、 swap分区的优先级(priority)有啥用?


1、什么是SWAP,究竟是干嘛的?

我们一般所说的swap,指的是一个交换分区或者文件。在Linux上可以使用swapon -s命令查看当前系统上正在使用的交换空间有哪些,以及相关信息:

$ swapon -s
Filename Type Size Used Priority
/dev/dm-4 partition 33554428 0 -1

从功能上讲,交换分区主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因内存不够用而导致oom或者者更致命的情况出现。

所以,当内存使用存在压力,开始触发内存回收的行为时,即可能会使用swap空间。

内核查swap的使用实际上是跟内存回收行为紧密结合的。那么关于内存回收和swap的关系,我们需要思考以下几个问题:

  1. 为什么要进行内存回收?
  2. 哪些内存可能会被回收呢?
  3. 回收的过程中什么时候会进行交换呢?
  4. 具体怎样交换?

下面我们就从这些问题出发,一个一个进行分析。


为什么要进行内存回收?

内核之所以要进行内存回收,主要起因有两个:

  1. 内核需要为任何时刻突发到来的内存申请提供足够的内存。所以一般情况下保证有足够的free空间对于内核来说是必要的。
  2. 另外,Linux内核使用cache的策略尽管是不用白不用,内核会使用内存中的page cache对部分文件进行缓存,以便提升文件的读写效率。
  3. 所以内核有必要设计一个周期性回收内存的机制,以便cache的使用和其余相关内存的使用不至于让系统的剩余内存长期处于很少的状态。
  4. 当真的有大于空闲内存的申请到来的时候,会触发强制内存回收。

所以,内核在应对这两类回收的需求下,分别实现了两种不同的机制:

  • 一个是使用 kswapd进程对内存进行周期检查 ,以保证平时状态下剩余内存尽可能够用。
  • 另一个是 直接内存回收(directpagereclaim) ,就是当内存分配时没有空闲内存可以满足要求时,触发直接内存回收。

这两种内存回收的触发路径不同:

  • 一个是由内核进程kswapd直接调用内存回收的逻辑进行内存回收;
  • 参见mm/vmscan.c中的kswapd()主逻辑
  • 另一个是内存申请的时候进入slow path的内存申请逻辑进行回收。
  • 参见内核代码中的mm/page_alloc.c中的__alloc_pages_slowpath方法

这两个方法中实际进行内存回收的过程异曲同工,最终都是 调用shrink_zone() 方法进行针对每个zone的内存页缩减。

这个方法中会再调用shrink_lruvec()这个方法对每个组织页的链表进程检查。找到这个线索之后,我们即可以清晰的看到内存回收操作到底针对的page有哪些了。

这些链表主要定义在mm/vmscan.c一个enum中:

「Linux」SWAP 深度解读

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 「Linux」SWAP 深度解读

发表回复