LWN:近期在讨论的一些内存管理相关patch!

ARMV8架构之memory管理与模型(一) 一个典型系统的memory map会被分隔成不同的逻辑区域,每个区域都要求有不同的memory属性,比如说: Access Permission属性定义的在User/Privileged模式下的读写权限. Caching属性定义了该memory空间是否会有副本存在于cache中. Buffering属性定义了访问该memory空间的操作是否能支持提前返回写response.等等. 如图1所示,操... 阅读详情

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

Some upcoming memory-management patches

By Jonathan Corbet
November 12, 2021
DeepL assisted translation
https://lwn.net/Articles/875587/

内存管理子系统仍然是内核中最复杂的部分之一,为了提升性能,它总是依赖于各种启发式规则。因此不出意料,开发人员仍在继续尝试改进这部分的功能。目前有许多内存管理 patch 在讨论中。继续阅读,来了解一下页表页(page-table pages)的 free、kvmalloc() flag、内存清除(memory clearing)以及 NUMA "home node" 等的进展。

Freeing page-table pages

每当用户空间在分配内存时,内核自然必须要找到一些 page 来满足这个分配内存请求。但是内核同时也必须要分配一些 page-table page 来将这部分新分配的内存地址创建映射(mapping )。在一个拥有 4KB 的 page size 以及 64 位地址的系统中,每 512 个普通的内存 page 就需要一个 page-table page(如果没有使用 huge page 的话)。对于那些具有非常庞大的地址空间的应用程序来说,仅仅是用在 page-table page 上的内存数量就很可观了。

在用户空间要用的 page 被回收的时候,在一些比如进行了 madvise() 之类调用的情况下,这些内存最终会被浪费掉。也就是说用户空间的 page 实际上从 working set 移除掉了,但是用来给它们创建 mapping 的这些 page-table page 继续保持占用状态。如果某个 page-table page 中映射了的所有 page 都被回收了的话,那么 page-table page 本身就是空的,没有任何作用。进行了大量内存分配然后又释放掉这些内存的应用程序就会导致很多没有用处的 page-table page 积累起来,这不是人们期望的状态。

来自 Qi Zheng 的一组 patch 就希望能解决这个问题。它为 page-table page 增加了一个引用计数(利用了 struct page 另一个可以重用的字段)。这个 page 的用户,比如 page-fault handler 等等,会负责递增这个引用计数,确保自己在工作的过程中这个 page 不会突然消失了。给用户空间的一个 page 添加一个 page-table entry 的动作也会递增这个引用计数,而回收一个 page 的时候就会递减这个引用计数。等引用计数下降到零时,内核就知道这个 page-table entry 实际上不包含任何 page-table entry,可以被释放了。

patch set 测试结果表明对这些空的 page-table page 进行回收就可以释放出很多内存,可供其他用途之用。另一方面,对 page-fault handler 在几个方面可以感受到影响。当然,这些影响之一就是每次添加 page-table entry 的时候增加了维护引用计数这个成本。但是对 page-table page 进行 free 这个动作也是有额外开销的。后续如果这部分地址空间要再次被使用的时候,就必须要分配一个新的 page-table page 了。总的来说,这个改动会导致在 page-fault 处理流程中的性能下降 1%。

这个开销可能就会导致一些用户无法承受了。不过,现在还没有相关的 sysctrl 开关选项来打开或关闭这种行为。如果这组 patch set 被合并的话,那么所有的系统都会对空闲的 page-table page 进行 free。也许有些场景下,只有有大量的 page-table page 牵涉其中,那么释放这些内存所带来的性能提升就可以超过 page-fault 这里的性能损失,但对于其他一些类型的应用可能就并不适用了。

More flags in vmalloc()

在 kernel 中用 vmalloc() 分配的内存必须要被 map 到内核地址空间的一个特殊位置。这跟 kmalloc()或 page allocator 分配出来的内存并不一样,无法直接通过内核的 direct memory mapping 来进行访问。曾经有一段时间大家不鼓励使用 vmalloc(),因为 vmalloc() 区域的地址空间很小,而且创建额外的 mapping 也会带来额外开销。不过,随着时间的推移,使用 vmalloc() 的地方已经越来越多了。64 位系统的出现消除了地址空间的限制,而且代码中需要进行多个 page 的分配的地方也越来越多。如果这个 buffer 中的所有 page 不需要是物理连续的,那么成功完成分配这个 buffer 的工作的可能性就越高。

然而,vmalloc()接口从没有支持过那些传递给 kmalloc() 的各种 GFP_* 标志(这些是用来调整内存的分配方式的),这个限制也同样存在于衍生的 kvmalloc() 等函数中。kvmalloc 函数会尝试调用 kmalloc(),并在失败时取而代之地采用 vmalloc()。对于一些内核子系统,尤其是文件系统来说,这是一个真是存在的问题,因为它们都需要能够在分配内存时带有 GFP_NOFS、GFP_NOIO 或 GFP_NOFAIL 等 flag。因此,一些文件系统中都在避免使用 kvmalloc(),而其他的文件系统比如 Ceph 则推出了自己的内存分配函数来解决这个问题。

Michal Hocko 用一个 patch set 解决了这个问题,他在 vmalloc() 子系统中加入了对上述 GFP_ 各种 flag 的支持,同时也让 kvmalloc() 支持起来了。这样一来这些函数就可以用在文件系统环境中了,也能删除掉 Ceph 特有的分配函数了。截至目前,这组补丁中的一个前提 patch 已经进入了 mainline,但其余的还没有 merge。很可能会在 5.16 合并窗口结束前完成合入,敬请关注。

Uncached memory clearing

现代计算机中总是喜欢使用大量的 memory cache 原因很简单:cache 可以提高性能。因此,看到 Ankur Arora 的这个 patch set 就会感到很有意思,因为它声称是通过绕过 cache 来提高内存性能。大家也许可以猜到,这是一个只在特定情况下有效果的改动。

如果内核需要将某个 memory page 里的内容全部都清零,那么肯定是需要依次执行一系列普通带有 cache 支持的写操作。这样就可以让系统自己挑选合适的时机来将 cache 中存放的数据写入到主内存中。一个刚刚被清零的 page,很大可能会很快被写入其他数据,因此将该 page 放在 cache 中就会加快这些写入操作的速度,其实可能根本不需要将最初的清零内容写入内存中。因此,使用 cache 在这种场景是有性能优势的。

但是当需要对大量的内存内容进行清零时情况就会发生变化了。如果需要清零的内存数量超过了最终一级(last level)cache 的大小,那么直接写入内存其实要比等待 cache 内容写到主内存去要快。因为这种大量的 write 操作也会把其他内容从 cache 中挤出来,而其中一些数据很可能在不久的将来就会需要直接使用了。所以,对于这种大范围的清零操作,更好的方法还是应该绕过 cache。

因此,Arora 的 patch set 修改了内核,当需要对一个 huge page(2MB)或 gigantic page(1GB)进行清零操作时,就使用 uncached write。这类情况经常发生在运行虚拟化 guest 的系统中,一个新的 guest 在最开始时需要基于 host 提供的大片清零过的内存区域,并且这些区域会是尽可能使用 huge page 或 gigantic page 管理的。这组 patch set 的测试结果显示,虚拟机创建时的性能提高了 1.6 倍到 2.7 倍。这应该足以说服大家接受这个改动了。

Setting a home NUMA node

NUMA 系统的特点是访问位于本地 NUMA node(或附近的 node)的内存要比访问远程节点的内存速度更快。这意味着我们可以通过控制哪些节点用来做内存分配,这样可能会有很大范围上的性能提升。内核提供了许多控制这类分配的操作,包括最近增加的 MPOL_PREFERRED_MANY,LWN 在 7 月份已经介绍过。

不过,Aneesh Kumar K.V.想再添加一个新的系统调用:

int set_mempolicy_home_node(unsigned long start, unsigned long len,
        unsigned long home_node, unsigned long flags);

这个系统调用将把 home_node 参数对应的 NUMA node 中从 start 开始的 len 字节的地址范围称为 "home node"。目前,flags 参数还没有使用。

home node 这个概念需要与 MPOL_PREFERRED_MANY 或 MPOL_BIND 内存分配策略结合使用。这些策略可以指定一组用于进行新的内存分配请求的 node,但并不指定哪一个节点是首选的分配 node。如果用 set_mempolicy_home_node() 设置了一个 home node,那么只要有可能,都会尽量在该 node 上进行分配。如果失败的话,内核就会根据 in-force policy 中所允许的 node 来 fallback 到相应 node 上进行分配,会优先选择离 home node 最近的 node。

目的是让应用程序对内存分配拥有更多的掌控,同时避免使用 slow node 的内存。目前还没有提及 NUMA 开发者们何时会放弃当前的做法,改为完全由用户空间提供的 BPF 程序来决定 memory-allocation 策略。

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

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

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

eb986245d24617854e8077fe5a17b9c7.png

蓝牙bluez enable bcm私有模式(brcm_patchram_plus1)方式介绍 蓝牙enable的三种方式,还有一些芯片厂家自己的工具,不具有通用性,所以单独拎出来介绍,比如bcm的brcm_patchram_plus1工具,这个工具的作用是在user space下载蓝牙fw以及触发标准的kernel中bt进行SIG HCI command的交互,来进行蓝牙使能的动作 阅读详情

相关推荐

深入探索Patch内存修改技术

Patch本质上是软件或系统的更新组件,用于修复、改进或添加新的功能。它是软件维护过程中的一个重要环节,确保软件能够在新环境或应对新挑战中继续稳定运行。在IT领域,几乎所有的软件产品都需要定期或不定期地发布Patch来应对各种问题。在我们深入了解内存修改技术的过程中,我们已经探讨了其核心原理、实际操作流程以及在不同领域中的应用。通过各个章节的分析,我们可以看到,内存修改技术虽然复杂,但已逐步成为IT专业人员必须掌握的一项技能。

weixin_36019375的博客 1112

LWN: NUMA对各种内存类型的分配策略!

关注了就能看到更多这么棒的文章哦~NUMA policy and memory typesBy Jonathan CorbetJuly 16, 2021DeepL assisted tra...

Linux News搬运工 1444

Qt中输出中文出现乱码(win10系统下)

当我刚开始在win10下使用Qt Creator(4.3.0版本)时,遇到过这么个问题:当程序输出中文时,中文会乱码,程序本身的中文未乱码。 乱码截图如下: 我查阅了很多资料,最后在自己的不断的尝试下,解决了乱码问题。进入主题,具体如何解决乱码? ① 首先,我们先设置一下,可以直观在Qt界面上看到文件的编码方式: 点击工具(tool)->选项(option)->文本编辑器->显示->Diplayfileencoding,将其勾选上,点击apply,即可,截图如下...

请叫我皮皮虾的博客 5199

深入理解计算机基础——virtual memory

页表 页表:记录虚拟地址到物理地址的映射 unallocated:未分配的 cached:缓存在内存中的(有效位=1) uncached:未缓存在内存中的 page hit:查找的页存在于cache中 page fault:查找的页不在cache中 内存保护 通过permission bits进行保护 虚拟地址翻译 1.CPU向MMU请求虚拟地址对应的物理地址 2.MMU查找cache中有没有对应的page table entry 3.如果page hit,则返回对应的page table en

I_ren的博客 629

解放双手,摆脱自建库的繁琐,立创EDA元件库转cadence原理图封装库实战技巧

解放双手,摆脱自建库的繁琐,立创EDA元件库转cadence原理图封装库实战技巧

u012790770的博客 3613

全景相机APP

以下是一款**全景相机APP**的完整源码,支持全景照片拍摄(多帧拼接)、全景预览、鱼眼矫正、图片保存/分享、360°全景查看等核心功能,基于Android原生Camera2 API(替代过时的Camera API) + OpenCV(图像拼接) + GLSurfaceView(全景预览)实现,适配Android 8.0+设备,可直接编译运行。runOnUiThread(() -> tvFrameCount.setText("已拍摄:" + frameCount + "帧"));// X轴旋转(上下)

寒寒豆豆软件公司的博客 179

VideoMemory, SystemMemory And AGPMemory

原帖在下文,笔记:DxFlag:像D3DUSAGE_DYNAMIC, D3DPOOL_DEFAULT, D3DPOOL_MANAGED, D3DPOOL_SYSTEMMEM这些都是给driver一些提示说我们想这样用这些资源(静态的,动态的。。。),到底这些资源会被如何管理还是driver来说了算。一些倾向是:D3DPOOL_DEFAULT:会根据usage来放置资源AGP memory是bios来决定分配的,这里有一个查看器,http://developer.nvidia.com/object/agp_m

安柏霖的专栏 3106

华为OD新系统机试真题 - 获取大写字母瓷砖拼出独特图案数量

华为OD机试新系统真题【获取大写字母瓷砖拼出独特图案数量】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统四月二十九号机试真题【获取大写字母瓷砖拼出独特图案数量】

qq_45776114的博客 1218

Linux内存管理(3):内存探测与初始化

1、内存探测     linux在被bootloader加载到内存后, cpu最初执行的内核代码是arch/x86/boot/header.S汇编文件中的_start例程,设置好头部header,其中包括大量的bootloader参数。接着是其中的start_of_setup例程,这个例程在做了一些准备工作后会通过call main跳转到arch/x86/boot/main.c:main()函数

Jack Zhou的专栏 5828

爬虫进阶必备:深入理解requests.Session(),提升爬虫效率与稳定性

前两天,有个朋友跟我吐槽,说自己写了个爬虫爬取某个电商网站的商品信息,刚开始跑得好好的,爬了大概几百页之后,突然就开始报错了。HTTP状态码一会儿429,一会儿403,最离谱的是有些页面明明登录了却显示未登录状态。他排查了半天也没找到原因,最后把代码发给我看。 我扫了一眼代码,发现一个典型问题:他每次请求都新建一个requests.Session(),甚至有些请求直接用了requests.get()。这就好比每次进超市都要重新注册会员,每次都重新跟服务器“握手”,不翻车才怪。 其实,这就是我们今天要聊的

2201_76125261的博客 1228

一文吃透 SAP HANA SDA:把分散数据当作本地数据来用的那把钥匙

摘要:SAP HANA SDA(Smart Data Access)技术详解:150字精要 SAP HANA SDA是一种数据虚拟化技术,允许在不复制数据的情况下访问远端数据源。核心功能包括: 通过Remote Source定义连接配置 创建Virtual Table作为本地代理 支持谓词下推优化查询性能 与SDI技术协同工作扩展数据集成能力 典型应用场景包括: 跨系统联邦查询 冷热数据分层管理 混合云数据整合 远程表复制(RTR)实现近实时数据同步 实施要点: 需关注适配器能力差异 合理运用查询下推优化

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 318

BrcmPatchRAM 开源项目安装与使用指南

BrcmPatchRAM 开源项目安装与使用指南 1. 项目目录结构及介绍 BrcmPatchRAM 是一个专为解决 macOS 上 Broadcom 蓝牙设备固件更新问题而设计的驱动程序。此项目的核心在于提供一种机制,在每次启动或唤醒时应用 PatchRAM 更新至 Broadcom 的 RAMUSB 基础设备上,确保其功能与 Windows 系统下的体验一致。 以下是项目的目录概览及其简要说明...

gitblog_00981的博客 1106

【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

大家好,我是阿光。本专栏整理了《深度学习100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。正在更新中~ ✨。

优快云 精品推荐 10万+

关于 Cached Physical Memory 和 Uncached Physical Memory

摘至:http://techpubs.sgi.com/library/dynaweb_docs/0640/SGI_Developer/books/DevDrvrO2_PG/sgi_html/ch01.html Cached Physical Memory—kseg0 When address bits 31:29 contain 100, access is directed to phy

闲云孤鹤 2740

华为OD机试真题 新系统【Skill执行链完整性检测】

华为OD机试 新系统真题【Skill执行链完整性检测】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【Skill执行链完整性检测】

qq_45776114的博客 763

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux内存管理--伙伴系统分配内存准备工作

linux内核内存管理的代码改变的有点大,主要是细节方面; 首先从 __get_free_pages()开始总结起: unsigned long  __get_free_pages(grp_t  gfp_mask, unsigned int order) /* * Common helper functions. */ unsigne

YuZhiHui_No1的专栏 1898

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux NUMA memory policy(内存分配策略)

参考内核文档:Document/vm/numa_memory_policy memory policy是决定在NUMA系统上从哪个节点分配内存的策略,它是一类提供给能更好利用NUMA系统进行内存分配的应用程序使用的编程接口, 请不要将它和cpusets混淆,后者是一种限定哪些process可以从该节点进行内存分配的管理机制,当一个task同时存在两种机制时,cpuset优先。 L

glmwu的专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LWN网站patch使用方法,给Linux内核打patch,编译内核,安装内核,启动时手动选择内核一条龙

LWN网站patch使用方法 如果是从LWN网站下载内核: 邮件格式的patch,直接把所有diff的部分复制下来保存在一个文档里,文档不需要有后缀,就是所谓的patch包了。 给Linux内核打patch 首先下载对应的Linux内核源码。5.x版本的内核源码下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ 首页地址: https://www.kernel.org/ 当然这个网站上也有官方版本的patch包可以下载。 解压缩后进入源码

weixin_43101609的博客 1470

分享补丁模块(带源码)InlinePatch,Hook,内存DLL注入 都有哦

这个模块是我使用易语言时写补丁最常用的一个模块(当然很多也是抄的),一开始我觉得bug肯定会很多,放出去肯定又会坑很多人,后来我发现坑坑更健康,当你明白一个东西的优缺点之后,你才会更好的选择你所需要的。所以呢,现在模块开源了,希望对某些朋友有参考意义或者说使用价值吧。 声明:大家使用过程中发现任何问题都不要来问我,请自己想办法解决。我现在已经完全放弃易语言了,改用VC++了。

sunflover454的专栏 7749

cached地址和uncached地址的区别

     cached地址和uncached地址的区别是,对cached地址的访问是委托给CPU进行的,也就是说你的操作到底是提交给真正的外设或内存,还是转到CPU缓存,是由CPU决定的。CPU有一套缓存策略来决定什么时候从缓存中读取数据,什么时候同步缓存。对unchached地址的访问是告诉CPU忽略缓存,访问操作直接反映到外设或内存上。 对于IO设备一定要用uncached地址访问,是因为你的

lovelfy的专栏 1105

LWN: 如何更好地支持在内存中存放秘密信息?

点击上方蓝色“Linux News搬运工”关注我们~Keeping memory contents secretByJonathan CorbetNovember 15, 2019原文...

Linux News搬运工 256
上一篇: LWN: 在 emacs 中提醒Trojan Source漏洞!
下一篇: LWN:对加速器驱动的硬性要求!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值