由于内存和磁盘的读写性能差异较大,Linux会在内存充裕时将空闲内存用于缓存磁盘数据,以提高I/O性能。相对的在内存紧张时Linux会将这些缓存回收,将脏页回写到磁盘中。而在进程的地址空间中,如heap,stack等匿名页,在磁盘上并没有对应的文件,但同样有回收到磁盘上以释放出空闲内存的需求。swap机制通过在磁盘上开辟专用的swap分区作为匿名页的backing storage,满足了这一需求。本文简要的对Linux中的swap机制进行了介绍。

一、swap分区

1. swap分区的创建

Linux中存在两种形式的swap分区:swap disk和swap file。前者是一个专用于做swap的块设备,作为裸设备提供给swap机制操作;后者则是存放在文件系统上的一个特定文件,其实现依赖于不同的文件系统,会有所区别。

图1 两种swap分区

通过mkswap命令可以将一个swap disk或swap file转换为swap分区的格式。随后可通过swapon和swapoff命令开启或关闭对应的swap分区。通过cat /proc/swaps或swapon -s可以查看使用中的swap分区的状态。

图2 swap分区的创建及使用

2. swap的数据结构

内核中使用swap_info_struct结构体来管理swap分区,其关键成员如下:

一个swap_info_struct对应一个swap分区。如下图所示,swap分区内部会以page大小为单位划分出多个swap slot,同时通过swap_map对每个slot的使用情况进行记录,为0代表空闲,大于0则代表该slot被map的进程数量。

图3 swap info

发生内存回收时,一个内存页会被回收到一个slot中,同时会修改pte内容为slot对应的swp_entry_t。swp_entry_t是一个64位的变量,其结构如下图所示,其中2-7位存放swap分区的type,8-57位存放slot在分区内的offset。内存换入时,通过pte的内容即可在磁盘上找到对应的slot。

图4 swp_entry_t

二、swap out

1. 回收流程

内核中的内存回收流程,最终都会走到shrink_page_list中,该函数对page_list链表中的内存依次处理,回收满足条件的内存。匿名页回收如下图所示,其回收需要经过两次shrink。

图5 swap out 流程

第一次shrink时,内存页会通过add_to_swap分配到对应的swap slot,设置为脏页并进行回写,最后将该page加入到swapcache中,但不进行回收。

第二次shrink时,若脏页已经回写完成,则将该page从swapcache中删除并回收。

2. swap slot cache

为了提高swap slot的分配速度,内核引入了swap slot cache机制。该机制定义了一个per_cpu的buffer,包含alloc和free两部分cache,分别用于分配和释放。

图6 swap slot cache

3. ssd查找算法

为了提高swap机制在ssd设备上的性能,内核引入了swap_cluster_info结构体。如下图所示,每SWAPFILE_CLUSTER个连续的slot会组合成一个cluster,内核在做内存换出时,会以cluster为单位查找空闲的slot,而不再遍历swap_map,从而降低了锁竞争,也保证了ssd设备上的磨损均衡。

图7 swap_cluster_info

三、swap in

1. 换入流程

当换出的内存产生缺页异常时,会通过do_swap_page查找到磁盘上的slot,并将数据读回,其流程如下图所示。

图8 swap in 流程

2. swapin_readahead

类似于IO预读机制,swap in的流程中也实现了预读。由于SSD的随机读写能力要强于HDD,在基于物理地址的预读机制之外,内核还引入了基于VMA的预读。两种预读方式可以通过/sys/kernel/mm/swap/vma_ra_enabled节点进行选择。

图9 swapin_readahead

四、总结

本文简要介绍了Linux中的swap流程及一些优化机制。随着SSD设备的快速发展以及新型存储设备的逐步应用,swap机制的性能得到了很大改善,并带来了一些新的优化方向。

参考材料

[1] https://www.kernel.org/doc/gorman/html/understand/understand014.html

[2] http://sopa.dis.ulpgc.es/ii-dso/leclinux/mm/swap/

[3] http://jake.dothome.co.kr/swap-1/

[4] https://lwn.net/Articles/704478/

[5] https://zhuanlan.zhihu.com/p/70964551

[6] https://blog.csdn.net/qkhhyga2016/article/details/88722458

扫码关注
“内核工匠”微信公众号
Linux 内核黑科技 | 技术文章 | 精选教程

Linux Swap 介绍相关推荐

  1. linux tf命令,Linux系统命令介绍之vmstat命令详解

    今天小编要跟大家介绍的vmstat命令详解.熟悉Linux系统和使用Linux系统工作的小伙伴都知道Linux的命令有很多,而真正在工作中用到的命令应该不超过几十个,为了让大家更好的掌握这些命令,小编 ...

  2. linux Swap交换分区概念

    Swap交换分区概念 什么是Linux swap space呢?我们先来看看下面两段关于Linux swap space的英文介绍资料: Linux divides its physical RAM ...

  3. linux swap扩大_linux 扩展swap

    在服务器上把硬盘接好,启动linux,以root登陆. 比如我新加一块SCSI硬盘, 首先用fdisk -l 查看新增硬盘的盘符,例如/dev/sdb; 将其分成三个区: #fdisk /dev/sd ...

  4. Linux虚拟内存介绍,以及malloc_stats和malloc_info 监控查看内存情况

    Linux虚拟内存介绍,以及malloc_stats和malloc_info 监控查看内存情况 zzhongcy 2019-04-09 10:33:08 3106 已收藏 3 分类专栏: Linux ...

  5. linux系统服务介绍

    linux系统服务介绍 在windows系统中,我们可以打开任务管理器来打开或者关闭某些服务.在Linux系统下也同样有这样的需求,那么linux下怎么打开类似于windows下的"任务管理 ...

  6. Linux虚拟化介绍

    一.Linux虚拟化介绍 1.虚拟化模型如下,通过虚拟化工具把cpu.内存.硬盘等真实硬件资源模拟成更少的虚拟硬件资源 2.为什么使用虚拟化? 硬件资源使用率最大化,独立出多台机器出来,把空闲资源利用 ...

  7. 修改linux swap空间的swappiness,降低对硬盘的缓存

    修改linux swap空间的swappiness,降低对硬盘的缓存 linux 会使用硬盘的一部分做为SWAP分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成'等待(stand ...

  8. linux内核模块是什么,Linux内核模块介绍,使用Linux模块的优点

    描述 1.1 Linux内核模块介绍1.1.1 Linux内核模块概述 嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性--用户只需要拿到相关驱动模块,再插入到用户的内 ...

  9. linux swap 分区调控(swap分区 lvm管理)

    注:linux swap分区 采用lvm管理,调控可以采用下面的方法 一.查看 swap    lv [root@testdb ~]# vgdisplay -v Finding all volume ...

  10. 【安全牛学习笔记】Kali Linux***测试介绍

    Kali Linux***测试介绍  安全问题的根源 优点:分工明确,工作效率高. 缺点:从业人员对系统没有整体的认识,对安全认识较为片面. 最大威胁是人,人都会犯错,安全问题不能100%绝对根除. ...

最新文章

  1. 单片机开发项目全局变量太多怎么管理?
  2. SQLi-LABS(11~20关详解)
  3. Code-First将多个实体映射到一张数据库表
  4. 微软 CEO 萨提亚·纳德拉:不要重复造轮子,提升技术强密度
  5. 使用HTML搭建知识库,TiddlyWiki 快速入门教程,尝试搭建个人知识库
  6. Windows计划任务执行时不显示窗口的问题
  7. 容器技术Docker K8s 26 容器服务ACK基础与进阶-监控管理
  8. 【病毒分析】——熊猫烧香 专杀工具C源码
  9. 学会这一招,轻松将PDF转网页HTML,快来码住
  10. TCP/IP框架总结
  11. MySql绿色版安装和配置
  12. 移动应用的引导模式设计
  13. The specified target project directory 项目名\src\main\resources does not exist 问题解决
  14. TS中ts和.d.ts文件的区别
  15. 快递鸟即时查询接口的连接和使用
  16. Lookahead、LazyOptimizer、MaskedAdamOptimizer、AdaBound
  17. 面试摘要【持续更新】
  18. 马悦凌:从初级护士到“民间奇医”[6]
  19. [Watermelon_book] Chapter 3 Linear Model
  20. 波形包络提取与峰值提取_干涉信号中的小波峰峰值提取方法与流程

热门文章

  1. 微博粉丝、关注批量删除
  2. 如果你喜欢平板又是QWERTY键盘控 联想推“握柄键盘”满足你
  3. Java多线程模拟医院排号叫号系统
  4. idea 控制台搜索快捷键
  5. Error 遇到错误:请求通道在等待 00:01:00 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能已经是更长超时的一部分
  6. 微信小程序之商品发布+编辑功能(多图片上传功能)
  7. 做数据分析很重要的思维模式!!!
  8. 【论文笔记_对比学习_2021】CONTRASTIVE LEARNING WITH HARD NEGATIVE SAMPLES
  9. PDF如何解密?这些方法你知道吗?
  10. 用GitHub做一份精美的在线简历