LWN:让user space触发巨页融合!

智能绿植管家:基于 ESP32 的室内植物自动补光与环境调控系统 本文设计的基于 ESP32 的室内植物自动补光与生长环境调控系统,实现了植物生长环境的自动化、智能化管理。硬件选型合理、接线简单,软件逻辑清晰、易于调试,能够有效解决室内植物生长环境不适的问题。系统具备良好的实用性和扩展性,可为园艺爱好者和小型培育场所提供稳定、高效的植物养护方案。 阅读详情

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

Triggering huge-page collapse from user space

By Jonathan Corbet
March 14, 2022
DeepL assisted translation
https://lwn.net/Articles/887753/

当内核首次开始支持巨页(huge page)的时候,这个方案把大部分的工作都留给了用户空间来做。系统管理员必须在一个专门的 hugetlbfs 文件系统中留出内存才能使用 huge page,而用户程序必须明确指定从那里来映射内存。随着时间的推移,新增的 transparent huge page 机制就开始把使用 huge page 的任务自动化了。但这一机制并不完美,一些用户认为他们自己才更加了解某一个进程是否应该使用 huge page。因此,随着 Zach O'Keefe 最近的 patch set 将 huge page 的控制重新交回到用户空间,现在 huge page 的机制又回来了。

huge page 是来自于 CPU 实现了更大的 page size。具体的 page size 取决于不同的处理器类型以及它的页表布局定义(page-table layout)。例如,一个 X86 处理器通常会支持 4KB 的 "base" page size,以及 2MB 和 1GB 的 huge page。huge page 省去了页表层次结构(page-table hierarchy)的最底层(或底层的多层),因此稍微加快了地址转换过程。不过,huge page 带来的性能优势主要还是来自于对处理器里数量稀少的 TLB (translation lookaside buffer)条目的压力。一个 2MB 的 huge page 需要一个 TLB 条目,而当该内存是映射成 base page 来访问的时候,则需要 512 个条目。对于某些类型应用来说,可以看到非常明显的速度提升,所以在可能的情况下,使用 huge page 是有价值的。

不过,使用 huge page 也是有成本的,首先就是来自它们的 huge 属性。进程并不总是需要那么大的、虚拟连续的内存区域,所以如果将所有的进程内存都放在 huge page 中,最终会浪费大量的内存。transparent huge page 机制就是试图通过扫描进程内存并找到 huge page 可能会有价值的地方,来找到一个平衡点。每次找到这样的位置时,base page 区域就被 "折叠(collapsed)" 成为一个 huge page,而其所属进程也不会意识到这里发生过变化。

不过,transparent huge page 也是有成本的。这个扫描本身就需要消耗 CPU 时间,所以 khugepaged 内核线程每秒可以扫描的内存数量是有限制可以设置的。通过施加限制来使 khugepaged 的开销保持在合理范围内,但也降低了 huge page 的使用效率,导致那些可以从中受益的进程就花了更多时间在更低效的模式下运行。

O'Keefe 的 patch set 背后的想法是允许用户空间在已知(或希望)使用 huge page 会有优势的地方,尽快触发 huge page 的融合(collapse)动作。这个想法最早是由 David Rientjes 在 2021 年初提出的,并最终由 O'Keefe 实现。O'Keefe 说,除了让 huge page 的融合能更早发生之外,这项工作还会让 huge page 进行融合所消耗的 CPU 时间也被记入提出请求的进程,更加公平合理。

它还允许进程来控制什么时候进行这项工作。存储在 base page 中的数据会分散在整个物理内存中各处,将这些 page 融合成一个 huge page,需要将数据复制到一个单独并且物理连续的 huge page 上去。因此,在复制过程中需要阻止对这些 page 的改动以及 CPU 时间消耗,因为这些都会导致延迟增加,所以在这段时间避免这些无关工作是有好处的。

一个进程可以通过一个新增的 madvise() 请求来请求一个内存范围的 huge page 进行融合:

int madvise(void *begin, size_t length, MADV_COLLAPSE);

这个调用试图把从 begin 开始的 length 那么多字节数的内存融合成 huge page。这些参数似乎没有什么对齐要求,尽管 huge page 确实有对齐要求。如果 begin 指向的这个 base page 是它所位于的 huge page 的中间,那么 begin 之前的那些 page 也会成为最终结果的一部分。换句话说,begin 将被向后对齐到包含 huge page 的正确起始地址。length 也是如此,如果有必要的话就会增加 length 来包含整个 huge page。

当然,我们不能保证这个调用可以成功创建出 huge page。这取决于很多因素,包括系统中是否有空闲的 huge page。哪怕操作成功了,极端情况下内核也可能在这个调用返回之前再次将 huge page 分割开来。如果能成功,就会拿到 0 返回值 0;否则将返回一个错误码。具体到缺乏 huge page 可用的情况下,将产生一个 EAGAIN 错误代码。

对 MADV_COLLAPSE 的支持也被添加到 process_madvise()中,允许一个进程在另一个进程中触发 huge page 融合。在这种情况下有几个 flag 可供使用(这些将是 process_madvise() 第一次真正开始使用 flags 参数):

  • MADV_F_COLLAPSE_LIMITS 控制着这个操作是否应该受到 khugepaged 所遵循的 huge page 融合限制条件的约束;这些限制是通过现有内核中的 sysctl 开关来设置的。如果调用进程缺乏 CAP_SYS_ADMIN 能力,那么就强制要使用这个 flag。可以说,需要一个明确 flag 来请求执行默认行为,这是有点奇怪的,但这就是现在的实现。

  • MADV_F_COLLAPSE_DEFRAG,如果使用这个 flag,就允许此操作强制 page compaction 来创建空闲的 huge page,哪怕系统配置不允许这样做。这个 flag 不需要任何额外的 capability 权限,也许是因为这个 compaction 的开销反正是由受影响的进程本身承担。

O'Keefe 说,最终得到了一种机制,允许用户空间来控制 huge page 的使用,也许就不再需要内核参与了:

虽然不需要说明这组 patch 的必要性,但 hugepage 的管理可以完全 offload 给一个充分了解情况的用户空间代理,从而取代内核中 khugepaged。

但是,首先,这项工作需要进入内核的 mainline。到目前为止,大多数 review 意见都集中在细节上,但 David Hildenbrand 确实对这个新操作的一个方面提出了异议。在当前版本的 patch 中,任何虚拟内存区域都会被创建 huge page,哪怕是那些被明确标记为不使用 huge page 的 madvise(MADV_NOHUGEPAGE)调用也一样。他说,这在 s390 架构上 "会严重破坏 KVM"。因此,这种行为需要改变。

目前的 patch set 只适用于匿名页,计划今后再添加对文件相关(file-backed)page 的支持。由于使用这个 patch 的理由之一是能够快速让可执行 text 段来使用 huge page,因此对 file-backed page 的支持似乎也很重要,开发者希望在批准合入这个工作之前先看到这一部分。不过,这个功能看起来对某些使用场景很有用,所以它应该迟早会进入 mainline。

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

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

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

78017b3acd1e1d4317171d3642299b00.png

电磁阀颤振工作原理 颤振 颤振,弹性结构在均匀气(或液)流中受到空气(或液体)动力、弹性力和惯性力(见达朗伯原理)的耦合作用而发生的大幅度振动,它是气动弹性力学中最重要的问题之一。 随着机电液一体化技术的发展,电液比例控制技术的应用越来越广泛。电液比例控制系统范围较广,在液压传动与控制过程中,系统能够接受模拟信号或数字信号,使输出的流量或压力连续成比例地变化,都属于此类。该控制系统的优点是充分利用了液压控制与电气控制的长处,即功率传递靠液压,信号处理靠电气的优化措施。 电液比例控制原理与要求 液压控制系统中两个最重要的被控参数 阅读详情

相关推荐

Cursor AI对话历史丢失?开源工具一键恢复项目聊天记录

在软件开发中,数据持久化与工作区管理是保障开发效率与上下文连续性的基础技术。其核心原理在于通过文件系统路径、数据库存储等机制,将应用状态与用户数据持久化关联。对于依赖AI辅助编程的开发者而言,对话历史是宝贵的项目上下文资产,记录了关键的算法思路、API使用范例和问题解决方案。然而,当开发工具(如基于VS Code的Cursor)采用基于项目绝对路径的工作区隔离机制时,项目路径的变更会导致历史对话看似“丢失”,实则是被隔离在了旧路径对应的数据沙箱中。这直接影响了开发体验与知识沉淀的效率。cursor-chat

weixin_26775679的博客 828

内存学习(四):内存映射1

**内存映射是在进程的虚拟地址空间中创建一个映射,分为以下两种。** + (1)文件映射:**文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间**,数据源是存储设备上的文件。 + (2)匿名映射:**没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间**,没有数据源。 通常**把文件映射的物理页称为文件页**,**把匿名映射的物理页称为匿名页。**

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2983

攻击时间控制的动态逆三维制导律(源代码)

%参考文献:《攻击时间控制的动态逆三维制导律》,哈尔滨工程大学学报,2010 %编程难点:视线坐标系与参考坐标系间的转换关系 一、采用本文方法结果 二、偏航通道采用增广比例导引律

算法小站 2393

linux内核源码分析之巨型页

当运行内存需求量较大的应用程序时,如果使用长度为4KB的页,将会产生较多的TLB未命中和缺页异常,严重影响应用程序的性能。如果使用长度为2MB甚至更大的巨型页,可以大幅减少TLB未命中和缺页异常的数量,大幅提高应用程序的性能。这才是内核引入巨型页(HugePage)的真正原因。巨型页首先需要处理器能够支持,然后需要内核支持,内核有两种实现方式•使用hugetlbfs伪文件系统实现巨型页;•透明巨型页;.........

3917

被Cloudflare 5秒盾虐了半个月,终用Python破局:UA+TLS指纹伪装实战,拦截率从42%干到3%

其实5秒盾不难破,难的是摸透它的检测逻辑——它不是“一刀切”地拦截爬虫,而是通过“多维度指纹校验”,判断你是不是“真实用户”。表层:UA和HTTP头要完整、匹配;中层:TLS指纹要和真实浏览器一致(核心);深层:行为要符合人类习惯(请求间隔、JS执行)。这套方案不仅适用于Cloudflare 5秒盾,很多基于指纹检测的反爬系统(如Akamai、Imperva)也适用。2025年的爬虫,早已不是“能爬就行”,而是“爬得稳、不被封”——指纹伪装就是实现这一点的关键。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1849

Vue+OpenLayers6一本通,OpenLayers6完整教程大全,OpenLayers6全知全解,OpenLayers6入门、实战、扩展进阶三合一专栏目录汇总

Gis开发入门,OpenLayers、Leaflet、Maplibre-gl和Cesiumjs地图引擎介绍以及几种地图服务vms、vmts介绍OpenLayers介绍,相比较其他地图引擎有什么优点OpenLayers7.x版本和6.x版本有什么区别,是否需要升级到OpenLayers7版本?OpenLayers6实战:OpenLayers创建自定义控件,以创建一个地图复位控件为例OpenLayers6实战,OpenLayers创建自定义鹰眼控件,自定义鹰眼控件样式,调整鹰眼控件位置、大小、文字和按钮等样式。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 2198

彻底解决内存性能瓶颈:Linux内核透明大页enabled参数全解析

你是否注意到生产环境中应用程序在高负载时突然出现延迟峰值?是否遇到过数据库服务器在处理大量并发查询时性能急剧下降?这些问题背后可能隐藏着一个被忽视的关键因素——内存页表管理效率。作为Linux内核最重要的性能优化特性之一,透明大页(Transparent Hugepage,THP)通过将传统4KB页面提升至2MB甚至更大尺寸,能够显著减少TLB(Translation Lookaside Buff...

gitblog_00048的博客 1704

uniapp:在map地图组件上添加控件,在地图上添加浮层展示自定义按钮或元素,uniApp如何在Map组件地图上添加悬浮在上面的图标/图片(全平台兼容安卓苹果app、H5网页、微信小程序、nvue)

uni-app的map添加控件问题,uniapp实现地图展示控件,uniapp小程序如何在map组件上增加按钮,uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp腾讯地图添加控件,uniapp百度地图添加控件,地图上展示控件并可以点击,在地图上展示控件信息,uniapp map地图怎么向地图上增加工具栏,使用cover-view将控件在地图上展示,解决uniapp map上添加浮层无法显示问题,不显示怎么办,css样式不生效,地图等最高层

✅ 精选推荐文章 3230

2024年Linux内核社区关于large folio和mthp的关键进展

所以唯一可行方案是THP recovery,也就是在被split的1GBTHP基础上,保留未被重新分配的页,并将已被重新分配的页的数据复制到额外的4KB页,然后将原有的1GB物理区域“物归原主”成THP。由于 mTHP 的 size 大于 4KiB 的 small folios,理论上,它更容易出现 false sharing 的情况,频繁迁移会导致内存跨 NUMA Node 来回 ping-pong,因此,在算法上,mTHP 暂时借用了 PMD-mapped 的 2-stage filter 机制。

GetnextWindow的专栏 2981

YOLOv8【第七章:损失函数篇·第1节】一文搞定,IoU系列损失函数!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1196

Python爬虫教程:微博热点话题抓取与社交媒体分析

微博是中国最大的社交媒体平台之一,拥有海量的用户和丰富的讨论话题。通过爬取微博的热门话题和讨论内容,我们可以深入分析用户的兴趣、舆论走势、社会情绪等。通过爬取微博的热点话题和讨论内容,我们可以获得关于当前热门话题的宝贵数据,并基于这些数据进行多种社交媒体分析。本文将通过Python爬虫技术,详细介绍如何抓取微博上的热门话题、话题讨论内容,并进行社交媒体分析。希望本文为你提供了一个全面的微博数据抓取与分析的指南,帮助你在社交媒体数据分析的道路上迈出坚实的第一步。微博上的一些页面内容是静态的,可以直接通过。

2201_76125261的博客 589

linux进程khugepaged,linux 透明巨页khugepaged 后台进程分析

简介:透明巨页Transparent Hugepage 可以代替以前的hugetlbfs方式。相关说明可以参考内核Documentation\vm\transhuge.txt文档。khugepaged :khugepaged 是透明巨页的守护进程,它的主要功能是定时唤醒,根据配置尝试将4k 的普通page转成2M等巨页,减少TLB压力,提高内存使用效率。khugepaged的处理过程中需要各种内存...

weixin_36072221的博客 1781

【AI智能体】基于OpenCode 搭建Skills环境与项目实战开发详解

基于OpenCode 搭建Skills环境与项目实战开发详解

congge 8899

LWN:用户空间的中断!

关注了就能看到更多这么棒的文章哦~User-space interruptsBy Jonathan CorbetSeptember 30, 2021LPCDeepL assisted tr...

Linux News搬运工 787

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LWN:epoll也要用ring buffer来跟用户程序交互了

A ring buffer for epollByJonathan CorbetMay 30, 2019epoll这一组system call系统调用设计目的就是希望能...

Linux News搬运工 479

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深入理解Linux网络技术内幕 P1-P2

细品

西门吹雪 539

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mmap & madvise 你知道它们吗?

我今天看到好多之前没有见过的系统调用和函数。。。。。晕了。。。。。。 madvise函数 这个东西,应该是系统调用,因为他在man手册的2区。 madvise 可以设置内存的分配方式。或者说成是分配的细节方式。 The advice is indicated in the advice argument which can be MADV_NORMAL

嵌入式 3604

Huge pages (标准大页)和 Transparent Huge pages(透明大页)

Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) ...

coco3600的博客 841

禁用大内存页面 transparent_hugepage=never

如果你也是grub2的linux系统,请通过以下步骤关闭大内存页面。 step1 编辑 /etc/default/grub,在GRUB_CMDLINE_LINUX加入选项 transparent_hugepage=never 1 2 3 4 5 6 7 GRUB_TIMEOUT=5 GRUB_DISTR

winsonyuan的专栏 6603

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 223

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 149

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 328

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 195

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 117

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 104
上一篇: LWN:随机数以及VM-fork!
下一篇: LWN:如何在Fedora中移除SHA-1?
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值