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

内存页面共享-KSM 首先查看这个 page 是不是可以和 stable tree 中的 page 合并,不可以的话,检查下它的检验值和之前是否有变化,如果变化则认为是写频繁的页面,跳过它;本文适合有基本Linux内存管理概念的新手阅读,且本文旨在从工作流程和设计思想上介绍KSM,在涉及到源代码的地方,进行了部分删减,如果想详细了解KSM,推荐阅读源代码及源代码中的注释。遍历ksm_mm_head链表(即进程的mm),然后再遍历进程地址空间的每个VMA,然后通过get_next_rmpa_item()返回rmap_item。 阅读详情

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

Process-level kernel samepage merging control

By Jonathan Corbet
April 13, 2023
DeepL assisted translation
https://lwn.net/Articles/928510/

内核相同页面合并(KSM, kernel samepage merging)功能可以在某些种类的场景中节省大量的内存,但是其存在的安全问题大大限制了它的使用。哪怕是在那些可以安全地启动 KSM 的情况下,内核所提供的控制接口也使得 KSM 不太可能被实际用起来。来自 Stefan Roesch 的一组小 patch 就希望通过改进和简化 KSM 的管理方式来改变这种情况。

正如它的名字所暗示的那样,KSM 的工作原理就是寻找内容相同的内存 page,并将它们合并成同一份,由所有用户共享。正如 Avi Kivity 在 2008 年首次提出该功能时所描述的那样,早期的使用场景是 "典型的多用户 gnome 小型计算机,上面所有 150 个用户都在同时阅读 lwn.net 而不是在工作";这种场景下会产生大量相同的 cache page,这些 page 就可以在系统范围共享而不需要重复生成了。还有其他一些使用场景,如运行相同软件的虚拟机或容器的时候,如果挑出其中最重要的工作负载,也可以得到优化。

对这种重复数据进行删除可能确实会有价值。事实证明,一些工作场景下产生了大量相同的 page;合并这些 page 可以大大减少这些情况下的内存使用,允许更多的工作被塞进系统。因此,KSM 看起来很有吸引力。由于安全和专利方面的考虑,导致这一功能的合并被推迟了一段时间,但它最终在 2009 年底进入了 2.6.32 版本。然而,事实证明,这种机制本身存在的安全问题比原先想象的要多。

KSM 的工作原理是扫描内存中的 page,来找出那些具有相同内容的 page。当发现这些页面时,所有的用户都将共享该页面的同一个副本,而其他重复的副本将被返回给系统的 free list。不过,必须注意一些问题: KSM 使用的是匿名页面(对应了文件内容的 page 已经通过 page cache 实现了共享),这些页面的所有者可以在任何时候改变其内容。很明显,一个进程如果修改了其中内容的话,不应该影响任何其他可能在共享该 page 的进程。为了确保这个正确行为,内核会将共享的页面标记为只读;如果一个进程对这样的 page 进行写入,那么会进行一次写时复制(COW, copy-on-write)的操作将被执行,从而给要写入的进程在此提供自己独立的副本。有了这种机制,page 就可以在互不信任的进程之间安全地共享,而这些进程完全不知道在它们背后发生了什么巧妙的处理。

至少,这是它原本的意图。对一个自己独立拥有的 page 进行写入是一个非常快速的操作,而写入一个强迫 COW 操作的只读 page 则需要相当长的时间。一个恶意进程可以利用这个时间差来确定一个 page 是否被内核共享映射了;这反过来又允许攻击者确定系统中是否存在一个具有特定内容的 page。如果有足够的时间的话,这些固定时间间隔的攻击方式可以用来发现一个特定的程序是否在系统上运行,确定另一个进程的地址空间布局随机化的偏移(address-space layout randomization offsets),甚至是泄露加密密钥。

与 KSM 相关的安全问题非常令人担忧,因此该功能一般不会被启用。开启它的唯一方法就是由那些希望参与共享的进程来发起 madvise() 调用(MADV_MERGEABLE),为指定的内存区域启用 KSM。很少有程序这样做,所以 KSM 没有被广泛使用。正如 Roesch 在封面邮件中指出的那样,即使是知道 KSM 并希望启用它的开发者,如果他们使用的是不提供 madvise() 的那些垃圾收集(garbage-collected)的语言,也可能无法达到这个目的。

对这个问题所提出的解决方案是一个新增的 prctl()操作(PR_SET_MEMORY_MERGE),它为整个进程设置 KSM 状态。如果使用了这个操作来开启 KSM,进程中每一个可以被合并的虚拟内存区域(VMA)都将启用 KSM,在其调用后所创建的任何符合条件的 VMA 也是如此。这个设置会被任何子进程所继承,因此,比如说一个控制组或虚拟机的第一个进程启用了 KSM,所有的子进程也将启用它。

该功能允许虚拟机或容器的编排系统对它所启动的工作负载都启用 KSM;KSM 的使用将不再是每个进程必须自己决定的设置了。编排系统可能对其运行的工作负载有更多的了解,从而能够确定是否可以安全地启用 KSM;而单个进程本身通常缺乏这种信息。Roesch 说,能够以这种方式启用 KSM 的系统 "展示出了 20%左右的空间增长"。换句话说,Kivity 在 15 年前描述的系统现在能够支持 180 个在摸鱼的 LWN 读者了,这对各方来说都是一个好消息。

这组 patch 还做了一些其他修改,主要是为了改进 KSM 产生的效率指标,因此管理员可以确定对 page 进行扫描工作的运行时间开销比起由此节省的内存空间来说是否值得。

这个 patch set 目前处于第五次修订。在以前的 review 中,大部分讨论都是关于内存节省究竟来自哪里的。在 KSM 的早期,最主要的来源是那些保持了大量 0 值填充 page 的工作负载,但现在似乎不是这样了;KSM 正在重新利用大量的非零 page。没有什么东西可以阻挡这组 patch 在不久的将来登陆 upstream。

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

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

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

format,png

Linux内存管理:(十)KSM内核同页合并 文章说明:Linux内核版本:5.0架构:ARM64参考资料及图片来源:《奔跑吧Linux内核》 阅读详情

相关推荐

KSM (内存管理合并相同页)

KSM (Kernel Samepage Merging) Ksm介绍 2.6.32引入了KSM(Kernel Samepage Merging)允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量。VMware 的 ESX 服务器系统管理程序将这个特性命名为 Transparent Page Sharing (TPS),而 XEN 将其称为 MemoryCoW。不管采用哪种名称和实现,

u014358116的专栏 8233

Linux内核- KSM

可以让多个客户机分配的内存数量之和大于物理上的内存数量。而对于使用相同内存量的客户机而言,在物理内存量不变的情况下,可以在一个宿主机中创建更多的客户机,提高了虚拟化客户机部署的密度,提高了。之后,如果有进程试图去修改被标识为“写时复制”的合并内存页,就为该进程复制出一个新的内存页供其使用。的命中率)都会提高,从而提高了KVM客户机中操作系统或应用程序的。,就将多个相同的内存合并为一个单一的内存页,并将其标识为“,则客户机之间的相同内存页的数量就可能比较大,这种情况下。了,减少了客户机的内存使用量。

m0_74282605的博客 461

KVM虚拟化的高级功能:静态动态迁移和KSM内存合页

一、KVM虚拟机迁移 1.1 KVM虚拟机迁移的主要应用场景 当一台 KVM 宿主机的负载比较高时,可将源 KVM 宿主机上的部分虚拟机迁移到负载较低的 KVM 宿主机中,以保证服务质量。 通过KVM 虚拟机迁移将多台负载较低的KVM 宿主机上的KVM 虚拟机集中迁移到某一台 KVM 宿主机上,从而达到节约资源的目的。 在升级 KVM 宿主机硬件设备时,可以将 KVM 宿主机上运行的 KVM 虚拟机迁移到其他KVM 宿主机上,以解决对硬件的依赖,从而实现业务不中断情况下对物理硬件

leon.yan的博客 1327

LWN:内核KSM综述!

关注了就能看到更多这么棒的文章哦~An overview of kernel samepage merging (KSM)By Jake EdgeNovember 29, 2023LPCChatGPT translationhttps://lwn.net/Articles/953141/[2023-12-08 Fri 12:57]在2023 Linux Plumbers Conference(LP...

Linux News搬运工 1468

Linux 操作系统原理 — 内存管理 — KSM 共享内存

目录 文章目录目录KSM 内存页共享的性能问题 KSM 内存页共享的性能问题 KSM(Kernel Shared Memory)是 Linux Kernel 的一种内存共享机制,在 2.6.36 版本引入。简而言之,KSM 用于合并具有相同内容的物理主存页面以减少页面冗余。在 Kernel 中有一个 KSM 守护进程 ksmd,它会定期扫描用户向它注册的内存区域,寻找到相同的页面就会将其合并,并用一个添加了写保护的页面来代替。当有进程尝试写入该页面时,Kernel 会自动为其分配一个新的页面,然后将新数据写

烟云的计算 4834

【C++】auto关键字(C++11,超详细解析,小白必看系列)

本文详细解析了C++中的“auto”关键字,介绍了其定义、基本用法、限制和高级用法,特别是与范围for循环和Lambda表达式结合的应用。

m0_73494049的博客 6万+

KSM Demo 分析

KSM是“Kernel SamePage Merging ”的缩写,中文可称为“内核同页合并 ”。它是一种节省内存的技术,从2.6.32版开始获得支持,内核需要打开CONFIG_KSM=y选项使用KSM机制。KSM允许内核在两个或多个进程(包括虚拟客户机)之间共享完全相同的内存页。KSM让内核扫描检查 正在运行中的程序 并比较它们的内存 ,如果发现它们有完全相同的内存区域或内存页 ,就将多个相同的内存合并为一个单一的内存页,并将其标识为“写时复制 ”。这样可以起到节省系统内存使用量的作用。

tugouxp的专栏 1560

手把手教你用STM32单片机DIY一个简易PLC(附完整电路图与PCB文件)

本文详细介绍了如何利用STM32单片机DIY一个简易PLC控制器,涵盖硬件设计、电路图解析、PCB布局优化及固件框架实现。通过完整的电路图和PCB文件,帮助读者从元器件选型到工业级优化,逐步构建可靠的PLC系统,特别适合工业自动化爱好者和学习者实践。

weixin_42527160的博客 570

kernel中ksm特性

ksm的全称是kernel samepage mergeing,主要用于合并内容相同的页面,只要用于虚拟机中 存在的大量的冗余页面。 在kernel中可以通过PageKsm 来判断一个页面是否是ksm页面 static __always_inline int PageKsm(struct page *page) { page = compound_head(page); return ((un...

jason的笔记 1825

EPICS电机支持(asynMotor)

EPICS电机支持(asynMotor)

yuyuyuliang00的博客 915

揭秘N531:这颗不到2毛钱的国产栅极驱动器,如何成为功率开关的“全能搭档”?

本文深入解析了国产栅极驱动器N531如何成为功率开关的“全能搭档”。针对MOSFET和IGBT等电压驱动器件在实际应用中需要大电流实现快速开关的核心痛点,N531凭借±500mA的强劲驱动能力、宽电压供电及高兼容性,有效降低开关损耗,提升系统效率与可靠性。文章通过实战案例与设计指南,阐述了这颗高性价比芯片在简化设计、降低成本方面的显著优势。

z5a6b的博客 620

内核同页合并KSM

KSM(Kernel Samepage Merging) 共享内存的概念在现代操作系统中很常用了,比如,一个程序启动时会与父进程共用它的全部内存。当其中一个进程发生变化时,就会触发写时复制,把原来的内容写入到新的内存页中,再进行修改。这时其他的未改动的页面仍然是共享的。在执行完exec之后所有的页面不再共享,父子进程各有各的物理页。 共享内存是进程间通信的一种手段,多个进程的地址空间共享同一块物理内存,共享内存的进程在进行修改之后同样也会修改物理内存。 当linux启用了KSM之后,KSM会检查多个运行中的

weixin_48101150的博客 1407

Vivado ChipScope Debugging: Overcoming Common DRC Errors in FPGA Design

本文深入解析Vivado ChipScope调试中常见的DRC错误,特别是AVAL-244和AVAL-245等时钟相关问题,提供实用的Tcl命令解决方案和最佳实践。通过将DRC错误降级为警告的技巧,帮助FPGA设计者高效完成调试流程,同时强调何时应保留DRC检查以确保设计可靠性。

weixin_30335575的博客 416

linux的ksm特性的使用限制

ksm(kernel same-page merging)是Linux kernel合并相同内存页面的特性,初期为虚拟化所用,在非虚拟化下也有类似的场景。 ksm的使用是有限制的。ksm只能用来合并私有匿名映射(文档是这么写的).但是查看kernel源码我没发现对文件映射的限制。在很多场景下,私有文件映射也是会产生大量相同页面的,用来进行合并是很合适的,所以我猜测ksm是可以用来对私有文件映射进行合并。此外,对于dax的页面,ksm也是不能合并的。这些限制从code中很容易找到: case MADV.

wujianyongw4的博客 897

java实现自动发送微信QQ消息(可发图片)

自动发送微信/QQ/微博等消息 一:功能:实现发送QQ/微信/微博消息,程序控制。 效果演示(实现自动发生QQ微信消息给女友,发微博信息也可以就不演示了) 二:原理讲解:将剪贴板的内容给发送到QQ微信中去,复制粘贴发送。 模拟真实操作进行发送信息。 三:前期准备,软件安装,及初步测试。...

XURUNFA950827的博客 1万+

【MuJoCo】第一章 仿真环境的搭建与入门

它通过优化的接触动力学算法,能够高效处理复杂的多体交互,这使其成为从机械臂操控到足式机器人运动,再到大规模强化学习训练的理想选择。特别是与 JAX 集成的 MJX 的推出,将高性能仿真的边界推向了新的高度,使得在单台机器上并行数千个仿真环境成为可能。我们将通过编写您的第一个仿真程序,逐步拆解 MuJoCo 的工作流,让您亲手感受物理引擎的脉动。这种加速能力对于需要海量仿真样本的强化学习算法(如 PPO)是颠覆性的,它将原本需要数小时的训练缩短到几分钟。上的几何形状,用于碰撞检测和可视化。

u012133341的博客 368

如何使用内存相同页合并特性

如何使用内存相同页合并特性

FinixLei的专栏 (https://github.com/FinixLei) 2296

上位机 寻边器 通讯实战

寻边器通讯接口实现 本文介绍了上位机与盖泽(Gazer)和JEL品牌寻边器的通讯接口实现方案。主要内容包括: 接口定义:创建了IAlignerOperation接口,定义了获取状态、控制运动、真空吸附等核心功能。 具体实现: 盖泽寻边器(GazerAlignerCjh):通过串口通讯,实现了回零、校准、移动位置等操作 JEL寻边器(JelAligner):同样基于串口通讯,包含错误处理、状态查询等功能 工厂模式:通过AlignerFactory工厂类根据设备品牌创建对应的实现对象。 设备加载:展示了如何在系

StevenChen的博客 375

KSM(Kernel Samepage Merging) 剖析:Linux 内核中的内存去耦合

简介:作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 Kernel Shared Memory (KSM)。KSM 允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量。本文探索 KSM 背后的理念(比如存储去耦合)、KSM 的实现、以及如何管理 KSM。服务器虚拟化     虚拟化技术从上世纪 60 年代开始出现,经由 IBM® System/360® 大型机得以流行。50 年过后,虚拟化技术取得了跨越式发展,使得多个操作系统和应用程序共

明月江の鱼 4万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

linux内核同页合并,深入linux内核架构--内存管理(伙伴系统)

伙伴系统伙伴系统承担内核初始完后的物理内存管理工作,负责管理各个zone中的物理内存分配,释放。其基本工作原理如下:把内存按照页划分成很多阶,最大阶为MAX_ORDER,一般设置为11,每个阶内存区的内存块数为2^n,我们称之为内存区。当进程申请一段内存时,总是从适合大小的阶中分配指定内存区,比如当分配7k(4k * 2^1,7k离8k最近)内存的时候,会从第1阶分配对应的内存区。当第k个阶的内存...

weixin_34207964的博客 568

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

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

千万级并发实现的秘密:内核不是解决方案,而是问题所在!

既然我们已经解决了C10K并发连接问题,应该如何提高水平支持千万级并发连接?你可能会说不可能。不,现在系统已经在用你可能不熟悉甚至激进的方式支持千万级别的并发连接。要知道它是如何做到的,我们首先要了解Errata Security的CEO Robert Graham,以及他在Shmoocon 2013大会上的“无稽之谈”——C10M Defending The Internet At Sca...

weixin_30752699的博客 449

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

linux ksm 内存 merge机制研究

ksm 是kernel samepage merge的简称,它会定期进行页而扫描,并把识别到的内存页副本进行合并,进而释放这些页面以供其他程序使用。通常合并后的页会被置为只读,当有其他程序要更改这个页面时,就会触发cow机制。系统会重新为这个程序单独生成一份副本ksm机制ksm维护两棵树,一棵stable树,一棵unstable树。其中stable树上维护的是已经merged过的页,由于这些页都是只

SIFT2009的博客 2214

Kernel Samepage Merging | 同页合并

https://www.kernel.org/doc/html/latest/admin-guide/mm/ksm.html

RToax 730

刘正元: Linux 通用块层之IO合并

作者简介: 刘正元,来自天津麒麟(kylinos.cn), linux内核爱好者,对内核IO子系统和内核调试工具这块比较感兴趣,向内核上游内核贡献过一些,目前在公司负责文...

Linux阅码场 6416
上一篇: LWN:Linux早期岁月!
下一篇: LWN:6.3 开发数据分析!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值