LWN:优化内存中经常需要访问的匿名页!

Linux内存管理专题 - 第13章:匿名folio与swap / 包含PG_swapbacked等标志// 用于swap缓存链表管理...无文件背景的页帧集合(典型应用:用户态堆/栈内存、共享内存、COW页。 阅读详情

关注了就能看到更多这么棒的文章哦~

Working-set protection for anonymous pages

By Jonathan Corbet
March 19, 2020

原文来自:https://lwn.net/Articles/815342/

内核中的memory-management subsystem竭尽全力在确保那些正在使用的page要在内存之中。不过有时候确实没法做到,从而导致性能下降,或者最坏情况下还会导致内存大量换入换出。得益于Joonsoo Kim的patch set,我们很可能很快就能看到在这个方面的巨大改善了。这个patch set改变了匿名页(anonymous page,指那些不是从磁盘上的文件而来的数据页面,也就是不属于file-backed页面)的管理方式。现在看来,唯一需要去做的就是如何利用现在memory-management代码中其他地方早已用起来的一个机制就好。

LRU lists

首先介绍一些背景信息会有助于理解这个patch set的工作机理。我们先来尽量简化一下,然后再慢慢增加细节。

虚拟内存系统,允许应用程序可以寻址使用远超过本机真实物理内存大小的空间,也就是说,在任一时刻中,某个进程的地址空间中很大一部分内容都是存放在二级存储上(译者注:例如swap分区)的。显然,进程接下来要用的内存页面最好都在物理内存之中。而kernel其实无法完全清楚哪些内存是真正要用的,只能基于一些假设来尽量预测一下。

有些假设条件的合理性可以很容易的就理解。比如,如果发现某个进程一直在对一个文件进行顺序访问,那么大概率来说它接下来会访问文件中当前正在访问的位置之后紧接着的数据。此外,绝大多数虚拟内存管理实现方案中都基于的一个共同假设,就是最近使用过的页面接下来很可能还会用到,而那些已经有段时间未用到的页面则通常不值得继续保留了。

为了实现后者这个机制,kernel里面维护了一个“least-recently used”(LRU,最近最少使用)list。物理内存中的属于user-space的页面都由这个链表来串起来。kernel时不时会查看一下LRU list上的页面,把那些最近访问过的页面移到list头部。当需要更多内存的时候,为了从二级存储设备上移入一些页面,会首先回收LRU list末尾对应的这些内存页面。

实际上kernel维护了不止一个LRU list。首先,“LRU list"实际上就包含了两个list:“active”和“inactive” list。其中的active list的功能基本就是上面一段中介绍的那样,只不过当要移除list末尾的页面的时候,其实是把它串到inactive list上去。在这个时刻,这些页面的访问权限就会被修改为不允许user-space access。如果有某个进程访问了其中一个内存页面的话,就会发生一次“soft” page fault(比较“温和”的内存缺页中断),从而马上开放对这个page的访问权限并把它加回active list上。在需要内存的时候,就会从inactive list回收内存页面。

因此inactive list就像是给这些page的第二次机会一样。不过它还有另一个职责:用来管理那些大概率会只用到一次的页面。有个经典的例子就是在进程读取某个文件的时候,读入内存的内容很可能只需要处理一次之后就不再需要了。这些内存页面不应该把其他那些近期还会用到的页面从物理内存中挤出去。kernel会把这些newly faulted, file-backed page(来自文件的数据、新近加载入物理内存的页面)直接放入inactive list,如果在被回收之前又访问过,才会把它们加入active list。

实际上情况更加复杂。根本不止2个LRU list。感兴趣的读者一定知道,针对file-backed(来自文件的页面)和anonymous page(匿名页)这两种情况,都有单独的active和inactive list。回收内存时,通常优先回收file-backed页面,然后才是匿名页,因为前者通常不需要写回,而匿名页则必须每次都写回到swap里面去,并且在下次需要的时候,读入文件内容也更加容易。需要注意针对这些file-backed内存页面,kernel还会维护一些“shadow entries”来记录近期从inactive list里面回收掉的那些page。如果这些page再次通过page fault机制回来,kernel就知道它之前把一些有用的页面错误地回收了,因此会做一些调整来避免下次出现。这个机制被称之为refault tracking。

Improving anonymous LRU-list behavior

Kim的patch set主要是针对匿名页和file-backed页面的处理方式中的两个主要区别。首先,file-backed页面会经过缺页中断加入inactive list,流程如上面所述,但是匿名页则直接进入active list。假如某个应用程序通过page fault加载了许多匿名页进来,那么就可能会把其他一些仍然有用的页面从active list挤到inactive list去。尽管这些新进来的页面可能只需要用一次,它们还是会把其他一些更加需要重复使用的页面不必要地挤出去。为了解决这个问题,Kim的patch set会也让匿名页先加入inactive list,跟file-backed页面处理机制一致。如若这些页面真的很有用,那么就会在soft fault发生的时候提升到active list去;否则的话就可以更快的被回收掉。

另一个改动是关于refault tracking的。目前的内核中,refault tracking只会对file-backed LRU list进行。当匿名页被回收的时候,内核会完全忘掉这些历史信息。我们观察到,上一个改动(缺页处理时直接把页面加入inactive list)可能会极大恶化这种情况:在inactive list加入新的页面会导致此前刚刚进来的页面在被第二次访问(从而可以加到active list)之前就被快速挤掉了。因此如果对匿名页的LRU list也增加refault tracking机制,就能检测到这种问题从而得到处理。

因此这个patch set就对匿名页也加上了refault tracking。做法其实很简单直接,毕竟refault tracking所依赖的代码早就已经存在,可以直接拿来用,仅仅需要扩展一下,不局限于只支持一个LRU list即可。不过这里还有一些其他细节要考虑。举个例子,因为匿名页在被回收的时候需要把内容写入swap,那么用来跟踪refault事件的shadow LRU entry也可以在这个时候写swap,并不需要一直留在RAM。

Kim也提供了一些跑分数据可以看到在各种情况下对memory-management功能行为的改善。不过memory-management maintainer Andrew Morton最关注的则是有一个自动测试结果表明在virtual-memory scalability test中有400%的提升。他问道:“One wonders why on earth we weren't doing these things in the first place?” Kim的回复中附上了2002年增加这个机制的patch,正是由Andrew Morton提出的patch。Morton很不好意思地说看来是要重新看一下当时的做法对于现在的kernel是否依然适用了 :)

目前在memory-management community里面看起来没有任何反对意见。这并不意味着就能很快合入了,memory-management patch通常需要经过无数测试以及review,然后开发者们才有信心合入。尤其是对于那些会影响一些启发式条件的patch格外需要注意,因为通常都会在意想不到的地方导致一些意外结果。这些patch甚至还没有合入-mm tree,只有走到这一步了之后才会得到更多的测试和review。因此,哪怕Morton说了“given all the potential benefits, perhaps I should be more aggressive here”,不过估计还是进不去Linux 5.7。不久之后应该会能进入mainline的。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

psi_exporter:Prometheus出口商,用于Linux内核中的压力失速信息(PSI) psi_exporter Prometheus出口商,用于Linux内核中的(PSI)。 要求 内核必须支持PSI( CONFIG_PSI=y ),至少需要Linux 4.20。 导出指标 导出以下指标: $ curl -s http://ip6-localhost:12345/ | grep -E '(journald|^#)' # HELP pressure_avg_10s_ratio Ratio of time spent under pressure in the last 10s at time of measurement # TYPE pressure_avg_10s_ratio gauge pressure_avg_10s_ratio{controller="cpu",id="/system.slice/systemd-journald.service",kind=" 立即下载

相关推荐

2-3 linux 内核页管理和lru list locking 优化1

Linux kernel page managementand lru lock optimization时奎亮Alibaba 基础软件部高级专家前Linaro

文件页和匿名页

匿名页和文件页 存储

SeventhD7 3751

【unity】解决unity编译器安装中文汉化包失败

查看是否有Localization目录如果没有就进行创建,然后点击打开Localization把下载的zh-hans.po文件复制剪切进去即可。如果有的同学中文包安装失败,我们找到相应的编译器版本,点击在资源管理器中显示按钮,我们找到简体中文,复制downloadUrl后面的值到浏览器打开进行下载,点击Edtior language选择框,选择简体中文,等待加载。我们点击当前目录的上一级,进入编译器目录。返回在文件管理器中点击Editor目录。编译器启动后点击Edit[编辑]按钮。复制或者剪切下载的文件。

weixin_44959182的博客 8022

Linux文件页、脏页、匿名页

文章目录1.一、什么是文件页?什么是脏页?什么是匿名页?二、linux swap原理三、内存回收的时机1、直接内存回收2、kswapd0内核线程四、内存回收的方式四、NUMA 与 Swap关系五、swappiness 1.一、什么是文件页?什么是脏页?什么是匿名页? 1、缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page), 此外除了缓存和缓冲区,通过内存映射获取的文件映射页,也是一种常见的文件页。它也可以被释放掉,下次再访问的时候,从文件重新读取。

喜欢打篮球的普通人 8164

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

ARM的CI-700和Arteris的NoC对比

设计理念:CI-700注重于为移动和客户端SoC提供定制化的互连解决方案,而Arteris的NoC更侧重于提供灵活、可配置的网络互连技术,适用于多种应用场景。性能与功耗:CI-700通过系统级缓存和网状拓扑结构优化性能和功耗,而Arteris的NoC通过物理感知和多协议支持来提升性能和降低功耗。功能安全:Arteris的NoC提供了功能安全支持,这对于汽车和工业应用尤为重要,而CI-700虽然也关注安全性,但未明确提及功能安全支持。互操作性。

ygyglg的专栏 2621

linux 匿名页的含义

解释linux 匿名页的概念

OS Developer的博客 1933

告别玄学调参:手把手教你用LSTM-AutoEncoder为传感器数据做异常检测(实战篇)

本文详细介绍了LSTM-AutoEncoder在传感器数据异常检测中的工程化实践,包括数据预处理、模型架构设计和生产环境部署策略。通过结合LSTM的时间序列处理能力和AutoEncoder的特征提取优势,该方法能够有效识别温湿度、PM2.5等传感器数据的异常模式,适用于工业物联网和室内空气质量监测等场景。

weixin_29212429的博客 477

linux内存管理中匿名页与文件页

在Linux内存管理中,匿名页(Anonymous Pages)和文件页(File-backed Pages)是两类关键的内存页类型,它们的区别主要体现在数据来源、换出机制、回收策略以及使用场景上。通过理解匿名页与文件页的差异,可以更有效地优化系统内存使用,避免性能瓶颈。回收优先级 较低(依赖Swap配置) 较高(优先回收干净页)数据来源 进程动态数据,无文件关联 文件内容缓存或映射。换出目标 Swap分区/文件 无需换出(干净页可丢弃)特性 匿名页 文件页。

最后一个bug的博客 1411

基于Simulink的二相混合式步进电机驱动器快速建模与仿真实践

本文详细介绍了如何利用Simulink对二相混合式步进电机驱动器进行快速建模与仿真。通过从零搭建电机数学模型、设计H桥控制逻辑,并集成步进时序,手把手指导读者创建可运行的仿真模型文件。该方法能有效验证控制策略,避免硬件调试风险,是学习与实践电机驱动开发的理想途径。

weixin_29171087的博客 147

ARM和FPGA之间的通信(硬件原理图篇)

设计该开发板的初衷是为了学习,但也希望今后能扩展其功能,看到大家都在diy示波器,自己也非常冲动的想DIY一把,于是呼选了arm+fpga的方案,fpga主要用来实现数据的高速采样,而ARM则提供数据的显示,以及一些人机交互的功能。那么该方案中最重要的地方就是ARM和FPGA之间的通信如何实现了。在网上查了很多的资料,有说将FPGA作为ARM的一个外设,可以通过DMA的方式来直接访问;也有说把FP

屌yy的博客 5万+

匿名页与文件页

本文详细解析了Linux内核虚拟内存管理中的两种核心内存页类型:匿名页(Anonymous Pages)和文件页(File Pages)。匿名页没有后备文件支持,主要用于进程私有数据(如堆栈),必须通过Swap回收;文件页与磁盘文件关联,作为页面缓存加速I/O,可直接丢弃干净页进行回收。文章从定义、来源、管理机制、优缺点等方面对比分析了两类内存页,指出匿名页灵活但回收成本高,文件页共享性强但依赖文件系统。最后提供了监控工具(如/proc/meminfo)和调优建议(如调整swappiness参数)

ACMIII的博客 988

173、LLC谐振变换器的PCB设计实战(布线)

LLC谐振变换器PCB设计实战要点 LLC谐振变换器的PCB设计核心在于控制寄生参数,避免高频振铃和EMI问题。功率回路需确保电流路径最短且紧耦合,谐振电容焊盘需加宽以减少发热。驱动走线应独立于功率回路,避免干扰,并合理控制宽度和长度。变压器绕组结构影响共模噪声,建议原边在外层并加屏蔽铜箔。地平面设计需根据功率等级选择整块或分割,大功率下功率地与信号地应单点连接。谐振电流采样推荐四端开尔文电阻以减少电感干扰。散热需优化铜皮和过孔布局,功率器件优先放置顶层。布局应先确定谐振腔,再排布控制电路。经验上需实测寄生

Jack010169的博客 46

LWN:让vma的匿名页不再匿名!

关注了就能看到更多这么棒的文章哦~Not-so-anonymous virtual memory areasBy Jonathan CorbetSeptember 3, 2021DeepL...

Linux News搬运工 951

YOLOv13添加OREPA模块 准确率提升10.56个点,map提升11.87个点。小目标轻量化

本文提出了一种新的OREPA(Optimal Recursive Edge-Preserving Attention)模块,通过结合递归和边缘保留注意力机制,显著提升了目标检测模型的性能。实验结果表明,添加OREPA模块后,准确率提升了10.56个百分点,mAP提升了11.87个百分点。OREPA模块包含三个核心组件:OREPA1处理特征图并保留边缘信息,Bottleneck_OREPA作为瓶颈模块降低计算量,OREPA类通过堆叠多个Bottleneck_OREPA增强网络表达能力。文章详细介绍了如何将OR

FJN110的博客 2761

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LWN:优化只有一个用户的内存!

关注了就能看到更多这么棒的文章哦~Optimizing single-owner memoryBy Jonathan CorbetMay 26, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/932391/内核里的内存管理子系统的主要优化目标是要能最大程度地共享资源。但是,正如 Pasha Tatashin 在 20...

Linux News搬运工 1095

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LWN: 多代化之后的LRU!

关注了就能看到更多这么棒的文章哦~The multi-generational LRUBy Jonathan CorbetApril 2, 2021DeepL assisted trans...

Linux News搬运工 1266

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

discuz列表页调用帖子_LWN 383162: 复杂设计下的匿名页反向映射处理

LWN中文翻译项目简介:LWN.net是一份著名的计算机在线刊物,专注于报道有关自由软件,特别是有关 Linux 和其他 Unix-like 相关操作系统的新闻和技术动态。泰晓科技LWN 中文翻译项目针对 LWN.net 的内核相关文章进行中文翻译,欢迎大家踊跃参与,翻译或者校对皆可,详情请阅读该项目主页位置:http://tinylab.org/lwn/。版权声明:本文最先发表...

weixin_36080939的博客 264

内存管理vma_LWN 75198: 虚拟内存之基于对象的反向映射的回归

LWN中文翻译项目简介:LWN.net是一份著名的计算机在线刊物,专注于报道有关自由软件,特别是有关 Linux 和其他 Unix-like 相关操作系统的新闻和技术动态。泰晓科技LWN 中文翻译项目针对 LWN.net 的内核相关文章进行中文翻译,欢迎大家踊跃参与,翻译或者校对皆可,详情请阅读该项目主页位置:http://tinylab.org/lwn/。版权声明:本文最先发表...

weixin_29661213的博客 315

LWN: 冻结page引用计数!

关注了就能看到更多这么棒的文章哦~Freezing out the page reference countBy Jonathan CorbetDecember 6, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/1000654/`page` 结构体是内核内存管理子系统的核心(目前是这样),其关键部分是存储在 `refcount`...

Linux News搬运工 1190

LWN:在进程级别完成内核相同页面合并(KSM)控制!

关注了就能看到更多这么棒的文章哦~Process-level kernel samepage merging controlBy Jonathan CorbetApril 13, 2023DeepL assisted translationhttps://lwn.net/Articles/928510/内核相同页面合并(KSM, kernel samepage merging)功能可以在某些种类的...

Linux News搬运工 1381

LWN:针对透明巨页的shrinker!

关注了就能看到更多这么棒的文章哦~The transparent huge page shrinkerBy Jonathan CorbetSeptember 8, 2022DeepL assisted translationhttps://lwn.net/Articles/906511/huge page 是 CPU 实现的一种机制,允许以较大的粒度(chunk)来管理内存。使用 huge pag...

Linux News搬运工 406

LWN:5.17 合并窗口的剩余部分!

关注了就能看到更多这么棒的文章哦~The rest of the 5.17 merge windowBy Jonathan CorbetJanuary 24, 2022DeepL assi...

Linux News搬运工 454

LWN:6.7合并窗口的后半部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.7 merge windowBy Jonathan CorbetNovember 13, 2023ChatGPT translationhttps://lwn.net/Articles/949957/截至 11 月 12 日,6.7 合并窗口关闭时,已经有 15,418 个非合并变更集被合并到主线内核中。于是这一轮成为了有史以来...

Linux News搬运工 995

LWN:6.11合并窗口的剩余部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.11 merge windowBy Jonathan CorbetJuly 29, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/982605/6.11-rc1版本的发布标志着 6.11 合并窗口于 7 月 28 日结束。当时有 12,102 个非合并变更集(...

Linux News搬运工 2366

LWN:让swap机制现代化:引入 swap table

为此,在 6.18 之前的内核中,交换子系统维护了一个名为 swapper_spaces 的数组,其中包含指向 address_space(地址空间)结构数组的指针。新的 table 数组在大多数架构上被设计为恰好占据一个页面,它是动态分配的,在交换文件未满时减少了交换子系统的内存使用。对交换过程的一个过于简化的描述大致如下:当内存管理子系统决定回收一个匿名页时,它会选择一个交换槽位,将页面的内容写入该槽位,然后将关联的交换条目存储在页表条目中(使用架构相关格式),并清除“存在(present)”位。

Linux News搬运工 97
上一篇: LWN:使用Jitsi进行视频会议!
下一篇: LWN:io_uring可以自动选择使用哪个buffer了!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值