Linux 内核page migration设计文档

概述

page migration设计之初是在numa system的各个node之间迁移physical pages,意味着进程页面的虚拟地址不会变化,物理地址发生改变,migration的目的将page迁移到临近的cpu上降低内存访问延迟。

页面迁移粗略步骤

A. In kernel use of migrate_pages()
-----------------------------------

1. Remove pages from the LRU.

   Lists of pages to be migrated are generated by scanning over
   pages and moving them into lists. This is done by
   calling isolate_lru_page().
   Calling isolate_lru_page increases the references to the page
   so that it cannot vanish while the page migration occurs.
   It also prevents the swapper or other scans to encounter
   the page.

2. We need to have a function of type new_page_t that can be
   passed to migrate_pages(). This function should figure out
   how to allocate the correct new page given the old page.

3. The migrate_pages() function is called which attempts
   to do the migration. It will call the function to allocate
   the new page for each page that is considered for
   moving.

1. 将页面从LRU列表移除。

使用isolate_lru_page将一批pages从LRU中隔离出来,同时会增加page->_refcount引用计数,避免迁移过程中被回收或者swap-out换出。

2. 使用一个函数找到一个空闲的页面当作迁移目的地。

3. migrate_pages函数实现迁移逻辑。

 

Non-LRU page migration

具体参考内核:bda807d4445414e8e77da704f116bb0880fe0c76 这个提交

尽管migration最开始是numa系统降低内存访问延迟,随着内核发展,申请high-order时候触发的memory compaction也是migration重要使用者。当前migration设计的存在一个挺严重的问题:只能迁移LRU列表中的Page。但是万事都有例外,比如某些内核,某些内核申请的pages还是可以迁移的,比如zsmalloc, virtio-balloon pages。

为了解决上面的问题,driver需要一种方式告诉kernel说,是可以迁移Non-LRU page的。高速内存的方式就是定义三个函数:


1. bool (*isolate_page) (struct page *page, isolate_mode_t mode);

What VM expects on isolate_page function of driver is to return *true*
if driver isolates page successfully. On returing true, VM marks the page
as PG_isolated so concurrent isolation in several CPUs skip the page
for isolation. If a driver cannot isolate the page, it should return *false*.

Once page is successfully isolated, VM uses page.lru fields so driver
shouldn't expect to preserve values in that fields.

2. int (*migratepage) (struct address_space *mapping,
        struct page *newpage, struct page *oldpage, enum migrate_mode);

After isolation, VM calls migratepage of driver with isolated page.
The function of migratepage is to move content of the old page to new page
and set up fields of struct page newpage. Keep in mind that you should
indicate to the VM the oldpage is no longer movable via __ClearPageMovable()
under page_lock if you migrated the oldpage successfully and returns
MIGRATEPAGE_SUCCESS. If driver cannot migrate the page at the moment, driver
can return -EAGAIN. On -EAGAIN, VM will retry page migration in a short time
because VM interprets -EAGAIN as "temporal migration failure". On returning
any error except -EAGAIN, VM will give up the page migration without retrying
in this time.

Driver shouldn't touch page.lru field VM using in the functions.

3. void (*putback_page)(struct page *);

If migration fails on isolated page, VM should return the isolated page
to the driver so VM calls driver's putback_page with migration failed page.
In this function, driver should put the isolated page back to the own data
structure.

non-lru movable page flags

对于这种non-lru的pages有个重要的问题是:内核怎么知道non-lru pages是否movable?因为linux struct page的flags成员并没有一个PG_movable的标志,所以这种方式行不通,需要另辟蹊径,让driver主动告诉kernel,使用如下函数:

 linux复用了page->mapping的最低两位,在内核里面page->mapping不仅可以用于标识non-lru page的movable特性,anon page也有在使用:

 为什么anon page要在低两位增加PAGE_MAPPING_ANON呢?如上面代码anon page的mapping字段实际指向的是一个anon_vma结构,又因为mapping字段的类型是address_space,所以上面强转伪装成了address_space,这么一伪装就把kernel欺骗了,如果不适用额外的手段,kernel无法知道page->mapping到底是anon_vma,还是address_space了!!!,所以对于Anon page也复用mapping的低两位,用于区分这两种情况,内核注释如下:

 内核这么处理就可以通过page->mapping的判定是否是Anone page,正如上面的PageAnon函数实现。

内核如何判定non-lru page movable?

上面绕了一圈,总结起来就是driver需要通过page->mapping的低两位上设置PAGE_MAPPING_MOVABLE告诉kernel non-lru page是movable的,kernel同时增加了__PageMovable判定这种non-lru page是否可以movable:

 注意:

1. LRU pages never can have PAGE_MAPPING_MOVABLE in page->mapping。

2. __PageMovable函数不能确保返回值的准确性,要100%准确判定non-lru page是否movable需要使用PageMovable函数:

 但是由于__PageMovable更速度轻量,且LRU中的page不可能设置PAGE_MAPPING_MOVABLE ,所以内核往往这样使用这两个函数:

1. __PageMovable判定page是否在LRU当中:

2. 先调用轻量级的__PageMovable判定movable,再通过PageMovable进一步确认,因为__PageMovable返回false肯定是不movable的,如果返回true,那需要进异步PageMovable判定,由于大概率__PageMovable就判定准确了,少部分降低到PageMovable二次确认,所以性能还是有好处的:

migrate_pages设计逻辑

内核文档介绍该函数实现逻辑如下:

上面步骤还是比较繁琐的,在本小节中我们先抓住重点梳理逻辑,先不陷入源码细节。迁移核心要做几个事情:

  1. 解除page A的映射,并映射到新page B。由于共享内存等原因,一个page可能被映射给多个进程的VMA里面,所以迁移的时候page可能涉及多个映射的解除。
  2. address_space的radix tree 从指向A到指向B.
  3. 新page B对应的flags和内容要和老page A一样。

 迁移的过程中除了进程1-3依然可能会继续访问Page A,内核内存管理系统其他的部分也可能访问PageA,应该避免内核的内存管理的其他部分干扰迁移。比如正在迁移PageA,内存子系统还在LRU里面扫描A,试图将PageA从inactive Lru移动到active LRU中,那么这就属于骚操作了,所以迁移过程会先通过isolate_lru_page将PageA从LRU中隔离出来,隔离出来之后就可以安心迁移PageA了,因为isolate会组织PageA被释放,也避免LRU的扫描动作,isolate_lru_page参考本文前面的分析。

PageA页面隔离之后,进程访问1-3访问PageA必须是无缝的,不能因为迁移页面就无法运行,当然迁移过程中进程被delay是可以接受的。迁移分3个阶段:

早期:进程的页表项依然指向PageA,此时进程可照常访问A。

中期:PageA已unmap,但是还没map到B,这个阶段属于空窗期,进程无法访问A,此时访问实际会触发缺页中断,然后缺页处理程序就是要等待map B,换个空窗期进程访问会延迟等到。

末期:pageB完成map,唤醒中期中被延迟等待的进程,并能访问到B。

上面中期等待是通过__migration_entry_wait完成:

中期阶段的时候,进程访问Page A会触发page fault,其此时会进程is_migration_entry逻辑(设置成migration entry是在unmap A的时候做的),然后migration_entry_wait等待迁移完成。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/90848.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4.14 tcp_tw_reuse 为什么默认是关闭的?

开启 tcp_tw_reuse 参数可以快速复用处于 TIME_WAIT 状态的 TCP 连接时,相当于缩短了 TIME_WAIT 状态的持续时间。 tcp_tw_reuse 是什么? TIME_WAIT 状态的持续时间是 60 秒,这意味着这 60 秒内,客户端一直会占用着这个端口。端…

桃子叶片病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)

1.分为三类 健康的桃子叶片 ,251张 桃疮痂病一般,857张 桃疮痂病严重,770 张 2. GUI界面识别效果和predict.py识别效果如视频所示桃子叶片病害识别(Python代码,pyTorch框架,深度卷积网络模型&#xff0…

探索图结构:从基础到算法应用

文章目录 理解图的基本概念学习图的遍历算法学习最短路径算法案例分析:使用 Dijkstra 算法找出最短路径结论 🎉欢迎来到数据结构学习专栏~探索图结构:从基础到算法应用 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:I…

光伏+旅游景区

传统化石燃料可开发量逐渐减少,并且对环境造成的危害日益突出。全世界都把目光投向了可再生能源,希望可再生能源能够改变人类的能源结构。丰富的太阳能取之不尽、用之不竭,同时对环境没有影响,光伏发电是近些年来发展最快&#xf…

淘宝商品数据采集(如何快速获取淘宝商品信息),淘宝API接口申请指南

淘宝作为国内的电商平台,拥有海量的商品信息。对于想要进行淘宝商品数据采集的人来说,如何快速获取淘宝商品信息是一个重要的问题。本文将介绍一些快速获取淘宝商品信息的方法。 1. 使用淘宝开放平台PI 淘宝开放平台提供了多种PI接口,可以通…

<C++> 内存管理

1.C/C内存分布 让我们先来看看下面这段代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char *pChar3 "abcd";int *ptr1 (int *) mal…

【Git】学习总结

【Git】学习总结 【一】安装【二】Git克隆项目代码【1】idea下载git项目【2】创建新的分支【3】新建的分支推送到远程【4】合并最新代码到主分支【5】切换分支 【三】提交本地项目到远程🚀1. 配置 Git🚀2. 创建项目远程仓库🚀3. 初始化本地仓…

vue2 生命周期,工程化开发入门

一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 二、Vue生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好)什么…

Hightopo 使用心得(6)- 3D场景环境配置(天空球,雾化,辉光,景深)

在前一篇文章《Hightopo 使用心得(5)- 动画的实现》中,我们将一个直升机模型放到了3D场景中。同时,还利用动画实现了让该直升机围绕山体巡逻。在这篇文章中,我们将对上一篇的场景进行一些环境上的丰富与美化。让场景更…

docker搭建opengrok环境2

引言: 虚拟机关闭后重新开启,理论上是需要重新启动一下docker的,以重新启动其中的服务。 命令基础: docker images:查看docker中现有的镜像 docker container ls -all:查看docker中目前在运行的containe…

2023国赛数学建模D题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

【Unity】制作一个简单的菜单栏页面并实现其功能

这是一个简单的菜单页面制作,接下来我们将制作一个完整的菜单页面,并且通过一定的代码去实现它对应的效果。这个主要的功能就是我们在游戏中如果想暂停一下或者重新开始,那么就要用到我们这个功能。接下来我们将实现在游戏中按ESC退出键可以调…

聚观早报 | 青瓷游戏上半年营收3.34亿元;如祺出行冲击IPO

【聚观365】8月26日消息 青瓷游戏上半年营收3.34亿元 如祺出行冲击IPO 索尼互动娱乐将收购Audeze 昆仑万维上半年净利润3.6亿元 T-Mobile计划在未来五周内裁员5000人 青瓷游戏上半年营收3.34亿元 青瓷游戏发布截至2023年6月30日止的中期业绩,财报显示&#xf…

vue3范围选择组件封装

个人项目地址: SubTopH前端开发个人站 (自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面) SubTopH前端开发个人站…

K8S如何部署ZooKeeper以及如何进行ZooKeeper的平滑替换

前言 在之前的章节中,我们已经成功地将Dubbo项目迁移到了云环境。在这个过程中,我们选择了单机ZooKeeper作为注册中心。接下来,我们将探讨如何将单机ZooKeeper部署到云端,以及在上云过程中可能遇到的问题及解决方案。 ZooKeeper…

免费开源使用的几款红黑网络流量工具,自动化的多功能网络侦查工具、超级关键词URL采集工具、Burpsuite被动扫描流量转发插件

免费开源使用的几款红黑网络流量工具,自动化的多功能网络侦查工具、超级关键词URL采集工具、Burpsuite被动扫描流量转发插件。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具&am…

【C++】初步认识模板

🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、泛型编程二、函数模板2.1 函…

【Java】基础练习(十)

1.判断邮箱 输入一个电子邮箱,判断是否是正确电子邮箱地址。 正确的邮箱地址: 必须包含 字符,不能是开头或结尾必须以 .com结尾和.com之间必须有其他字符 (1) Email类: package swp.kaifamiao.codes.Java.d0823; /** 输入一个…

4-4 Representing text Exercise

本文所用资料下载 一. Representing text Let’s load Jane Austen’s Pride and Prejudice. We first split our text into a list of lines and pick an arbitrary line to focus on: with open(D:jane-austen/1342-0.txt, encodingutf8) as f:text f.read() lines text.…

简单了解文件上传漏洞(md版)

简单了解文件上传漏洞 一、什么是文件上传漏洞二、常见功能点三、成功的前提四、文件上传的校验方式五、Pass-1六、Pass-2七、蚁剑结合msf获取目标权限 一、什么是文件上传漏洞 在文件上传的功能处,如果服务端未对上传的文件进行严格的验证和过滤,导致攻…
最新文章