LWN:针对透明巨页的shrinker!

Linux下大页HugePages与透明大页Transparent HugePages Linux下的大页分为两种类型:标准大页(Huge Pages)和透明大页(Transparent Huge Pages)。 Huge Pages有时候也翻译成大页/标准大页/传统大页,它们都是Huge Pages的不同中文翻译名而已,顺带提一 下这个,免得有人被这些名词给混淆、误导了。 阅读详情

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

The transparent huge page shrinker

By Jonathan Corbet
September 8, 2022
DeepL assisted translation
https://lwn.net/Articles/906511/

huge page 是 CPU 实现的一种机制,允许以较大的粒度(chunk)来管理内存。使用 huge page 可以显著提高性能,这就是为什么内核有一个 "transparent huge page" 的机制,会在可能的情况下去创建 huge page。但是,只有当它所包含的大部分内存真正都被使用时,huge page 才是有价值的;否则它只会是对内存的巨大浪费。来自 Alexander Zhu 的这组 patch 实现了一个新机制,可以检测出未被充分利用的 huge page,并将浪费的内存找回来,供其他用途使用。

大多数运行 Linux 的系统的 base page size 是 4,096 字节,这个数字多年来一直保持不变,尽管这些系统中所拥有的内存数量在增长。典型情况下,可以将 512 个物理连续的 base page 组合成一个 huge page,就可能可以减少管理这些 page 的开销。但更重要的是,处理器中的 TLB(translation lookaside buffer)数量很少,TLB 是用于缓存虚拟地址到物理地址的转换结果的,使用 huge page 则可以占用更少的 TLB。TLB miss 如果发生了,性能损失会很大,所以如果能扩大 TLB 可以支撑的内存地址空间的话(就像 huge page 起到的效果)就可以显著提高性能。

huge page 通常来说 size 都更大,所以它的缺点就是容易有内部碎片(internal fragmentation)。如果一个 huge page 只有一部分被实际使用了,那么其余部分就是浪费的内存,不能给别人用了。由于这样的 page 中包含的实际在用的内存很少,那么我们希望达到的目标(TLB 带来的性能提升)就无法实现了。在最坏的情况下,我们完全应该将一个利用率很低的 huge page 分解成 base page,只保留那些明显在使用的 page。内核的内存管理子系统可以将 huge page 分割开来便于回收(reclaim),但是它无法找到哪些 huge page 是未被充分利用的。

Zhu 的 patch set 就是通过几个步骤来填补这一空白的。首先弄清系统中哪些 huge page 被充分利用了,哪些没有。因此需要启动一个扫描函数,每秒钟都从内核 workqueue 中醒来运行一次;每次运行时会检查多达 256 个 huge page,以确定每一个被利用的充分程度。只会扫描 anonymous huge page,也就是目前并不涉及 file-backed huge page。扫描结果可以从 /sys/kernel/debug/thp_utilization 中读出来,看起来像下面这样的表格:

Utilized[0-50]: 1331 680884
Utilized[51-101]: 9 3983
Utilized[102-152]: 3 1187
Utilized[153-203]: 0 0
Utilized[204-255]: 2 539
Utilized[256-306]: 5 1135
Utilized[307-357]: 1 192
Utilized[358-408]: 0 0
Utilized[409-459]: 1 57
Utilized[460-512]: 400 13
Last Scan Time: 223.98
Last Scan Duration: 70.65

这个例子(取自 patch 的说明邮件)是一个直方图(histogram),显示了包含特定数量的已在使用的 base page 的 huge page 的数量。例如,第一行显示了有多少个 huge page 仅使用了不超过 50 个 base page,这里有 1331 个这样的 huge page,其中包含 680,884 个未使用的 base page。这个结果有一个明显的特征:几乎所有的 page 都位于两个极端之上。一般来说,一个 huge page 要么被完全利用了,要么几乎完全没有利用起来。

在解释这些数据时,需要回答的一个重要问题是:代码是如何确定一个 huge page 中的哪些 base page 正在被实际使用中?CPU 和内存管理单元在这个任务中没有提供太多的帮助;如果内存被映射为一个 huge page,就不可能去检查其中每个 base page 的 "accessed" bit 了。因此需要使用 Zhu 的 patch set 来对这部分 memory 进行扫描,看看那里存储了什么。那些全 0 的 base page 都被认为是未使用的,而那些包含了非零数据的 base page 则被当作已在使用中。这显然不是一个完美的判断条件;毕竟一个程序可以用非零数据来初始化 page,然后再也不碰它们。但可能很难设计出一个更好的、不需要主动将 huge page 分解成 base page 的方法。

扫描的结果确定了系统中 huge page 中的一部分应该被拆分成更小的 base page。不过在目前的内核中,拆分一个由 0 填充的 huge page 会导致产生很多全是 0 的 base page,而且不能马上增加 unused memory 的数量。Zhu 的 patch set 改变了分割 huge page 的方式,使其直接丢弃那些全是 0 的 base page,而不是将其重新映射到进程的地址空间上。由于这些是匿名页,所以如果进程最终访问了其中一个被丢弃的 page,内核可以快速地替换一个新分配的、由 0 填充的 page 上来。

最后一步是在内核里寻找需要回收的内存时,主动拆分那些未被充分利用的 huge page。为此,scan 代码会把利用率最低的 page(如上图所示的 0-50 这一档里的 page)添加到一个新的 linked list 链表里,这样就可以快速找到它们。在内存管理子系统中注册了一个新的 shrinker (内存回收机制),会在内存紧张时调用。在被调用时,这个 shrinker 将从未被充分利用的 huge page 链表中取出一些,并将其分割,最终就可以把其中的所有全是 0 的 base page 返回给系统。

关于这组 patch 的大多数评论都集中在细节上,而不是它的整体方式。David Hildenbrand 表达了一个担忧,即在一个由 userfaultfd() handler 程序所管理的区域中,如果该 handler 程序后来收到它预料之外的 page fault,那么如果对全是 0 的 page 进行 unmap 可能会导致混乱。Zhu 回答说,如果这是一个问题,在 userfaultfd() 管理的区域中,可以把这些全是 0 的 base page 映射到内核那个共享的 zero page 上。

自从 transparent huge page 在 2011 年合入 2.6.38 内核后,kernel 就已经支持了这个功能,但目前仍未对所有进程启用这个功能。其中原因之一就是担忧内部碎片问题可能超过了透明巨页所提供的好处。Zhu 的目标很明确,就是希望让这个问题消失,从而允许默认启用透明巨页。如果这项工作获得成功,它可能代表了一个长期存在的内核功能的重要一步,可以把它的潜力完全发挥出来。

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

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

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

format,png

Linux内存管理(9):HugePage 巨页文件系统(HUGETLBFS)、透明巨页(Transparent HugePage, THP) 阅读详情

相关推荐

Android USB(type-c)耳机调试分析(十)

简介:优快云博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!】🚀】🚀人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.​更多原创,欢迎关注:Android系统攻城狮​1.前言本篇目的:理解Android USB(type-c)耳机调试分析。

Android系统攻城狮 3996

关闭透明大页的原因及方法

Oracle Rac关闭透明大页的原因及方法 Oracle Rac:关闭透明大页的原因及方法 【前言】在 Oracle 安装之前的准备工作中,有一项必须的工作是:禁用透明巨页(Disabling Transparent HugePages)。 那问题来了:为什么要关闭透明大页? 以及怎么进行禁用? 先来看下比较权威的介绍: https://blogs.oracle.com/linux/post/performance-issues-with-transparent-huge-pages-thp 划重点:

qq_20408423的博客 9371

Linux内存管理(65):shrink_node 详解

在页面回收简介和 kswpd(1)直接页面回收机制:在内核态里调用页面分配接口函数 alloc_pages() 分配物理页面时,由于系统内存短缺,不能满足分配请求,因此内核会直接进入页面回收机制,尝试回收内存来解决当前的燃眉之急,这就是直接页面回收机制。周期性回收内存机制:这是 kswapd 内核线程的工作职责。当内核路径调用 alloc_pages() 分配物理页面时,由于系统内存短缺,没法在低水位情况下分配出内存,因此会唤醒 kswapd 内核线程来异步回收内存。

私房菜 2万+

linux内核源码分析之巨型页

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

3917

ORACLE RAC关闭透明大页的原因及方法

在 Oracle 安装之前的准备工作中,有一项必须的工作是:禁用透明巨页(Disabling Transparent HugePages)。 那问题来了:为什么要关闭透明大页? 以及怎么进行禁用? 简单来说就是 Oracle Linux team 在测试的过程中发现,如果 linux 开启透明巨页THP,则 I/O 读写性能降低 30%;如果关闭透明巨页 THP,I/O 读写性能则恢复正常。另,建议在 Oracle Database 中不要使用 THP。 接下来说一下透明巨大页面是什么? Linux 下的大页分为两种类型:标准大页(Huge Pages)和透明巨页(Transparent Hu

问题:dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)

 1. 问题:Ubuntu安装软件的过程中出现依赖项的问题 “E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).” 按照指示执行如下两条命令都没有解决问题。 sudo apt-get -f install sudo apt-get --fix-broken ...

gloria_littlechi的博客 2万+

透明巨型页和标准巨型页-1

1、巨型页的好处 运行内存需求量比较大的应用,如果使用page-4k的话,会产生太多TLB-miss和pagefault的情况,严重影响性能。使用巨型页,就可以减少这些情况,提高性能,但是缺点是相比较page-4k内存会浪费的多 2、巨型页的支持 需要处理器和内核一同支持,实现的方式是透明巨型页(AnonHugePages)和标准巨型页(Hugetlbfs) 2.1 透明巨型页(AnonHugePages)的使用: cat /sys/kernel/mm/transparent_hugepage/e

zf1575192187的专栏 1364

网易数智CoreAgent实战:5步教你打造企业级AI数字员工(附避坑指南)

本文以网易数智CoreAgent智能体协作中枢为核心,提供了一份企业级AI数字员工的实战部署指南。文章详细拆解了从环境准备、智能体配置、业务集成、安全合规到效果评估的五个关键步骤,并分享了部署过程中的常见“避坑”经验,旨在帮助企业技术团队高效、安全地将AI智能体落地于实际业务场景,解决AI落地难题。

rice5的博客 951

Linux 内存巨页与透明巨页学习

Huge Pages(静态巨页):静态巨页,就是系统启动时就预先分配好、数量固定、位置固定、不会被内核动的大页内存。通过大幅减少页表数量、提高 TLB 命中率,显著降低 CPU 地址翻译负担。Transparent Huge Pages (透明巨页)THP 透明巨页是内核自动把 4KB 页合并成 2MB 巨页的机制,合并时会卡顿,对应用透明。优点是自动优化、无需配置;缺点是会造成内存紧缩、CPU 毛刺、IO 波动。

qq_50247813的博客 485

I2S时序及音频驱动

I2S、音频驱动

qq_41882586的博客 3946

5分钟搞懂深度学习如何革新声源定位:从GCC-PHAT到DNN的实战对比

本文深入对比了深度学习与传统GCC-PHAT方法在声源定位领域的实战表现。通过具体实验数据,展示了DNN模型在强混响、低信噪比等复杂场景下,如何实现定位准确率的显著提升,并探讨了其数据驱动范式带来的鲁棒性优势与工程部署挑战。

3a9bq4r8t2y的博客 223

内存管理:巨页HugePage

如果启动"always",那就是系统默认进行在分配巨页的时候,所需要的内存大于2MiB,将会默认分配巨页,请注意,分配的内存并一定都是巨页,巨页是按照某个配置项设置的"伪对齐",比如我自己实践的虚拟机,默认2MiB对齐(pmd中间页表项)。传统巨页的实现核心是提前预留巨页内存,但是在通过hugetlbfs分配传统巨页无法满足的时候,系统会从buddy分配物理内存,生成临时巨页,这些巨页因为也是通过hugetlbfs的方式使用,也属于传统巨页。内核完成了这套流程的代码,用户是不可能见的。...

weixin_71478434的博客 2204

Python 使用Pygame库实现足球游戏:创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理

本文将介绍如何使用Python和Pygame库创建一个简单的足球游戏。我们将搭建一个基本的游戏环境,创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理。这个简单的足球游戏展示了Pygame的一些基本功能。虽然这是一个简单的游戏,但它包含了创建游戏循环、用户输入处理、物理模拟、碰撞检测等重要概念。

程序熊的博客 743

LWN:两种方式来创建multi-size THP透明巨页!

关注了就能看到更多这么棒的文章哦~Multi-size THP creation, two different waysBy Jonathan CorbetFebruary 13, 2025Gemini-1.5-flash translationhttps://lwn.net/Articles/1009039/Huge pages (巨页)可以提升许多程序的性能,但它们本身也可能带来不利的性能影响...

Linux News搬运工 1143

SHP转TXT、TXT转SHP工具(附工具下载链接)

关于TXT,可以选择整个图层生成一个TXT。也可以勾选“每个地块单独存TXT”,然后选择一个字段,根据字段值,给每个地块生成一个TXT文件。支持选择和数据框一样的坐标系,也可以选择一个图层,工具会采用和这个图层一样的坐标系。1、TXT数据支持输入单个或者多个TXT文件,也可以直接选择TXT所在的文件夹。所有的TXT数据都生成到一个矢量数据图层。关于这一行的内容,可以在地块坐标行设置中进行设置。其他:①面节点闭合:勾选,则回到起点。属性描述:可以直接复制粘贴进来,也可以直接修改。也可以改为任意字母。

坐听风雨 4294

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

前程算法屋的博客 624

linux kernel内存回收机制

http://www.wowotech.net/linux_kenrel/233.html 无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有内存使用。页面回收的方式有页回写、页交换和页丢弃三种方式:如果一个很少使用的页的后备存储器是一个块设备(例如文件映射),则可以将内存直接同步到块设备,腾出的页面可以被重用;如果页面没有后备存储器

zdy0_2004的专栏 5504

23种设计模式-中介者(Mediator)设计模式

软考中级-软件设计师 中介者设计模式

片言可决讼,半纸能缚龙 1863

深入理解 Linux 内核---回收页框

页框回收算法:阐述了内核回收页框的原因测量。 反向映射:技术补充,介绍了内核使用的一种数据结构,借助该结构,内核可快速定位指向同一个页框的所有页表项。 PFRA实现:介绍 Linux 使用的页框回收算法。 交换:讲述了交换子系统,它将匿名页(并非文件的映射数据)保存到磁盘的内核。 页框回收算法 Linux 内核的页框回收算法(page frame reclaiming algorithm, PFR...

新博客:https://aping-dev.com/ 2081

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux 内存管理总结(slab kmalloc vmalloc)

Memory Zone Linux使用虚拟内存技术,所以在应用层所能看到的、访问的都是虚拟地址。对于32位系统来说(本文涉及的都是32位系统),每一个进程可以寻址的地址空间都是4G,无论物理内存有多大。应用开发者其实是可以不用关心内存空间的划分,仅仅使用封装后的接口就可以完成开发。但在工作中,如果对地址空间没有基本的了解,在程序设计和解决问题时可能会引起方向性错误。这里对地址空间进行简单介绍,下图时网上常见的x86架构的内存区域划分。 物理内存被分为三个区域:ZONE_DMA,ZONE_NORMAL,ZO

qq_41945905的博客 3361

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

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

Linux之关闭大页【即关闭透明大页】

关闭大页【即关闭透明大页】 1.脚本如下: #!/bin/bash for HOST in `cat hosts` do echo $HOST ssh -t laowang@$HOST "sudo bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'" ssh -t laowang@$HOST "sudo...

说文科技,做有态度的研究。 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lowmemorykiller内核回收机制注册、回调

LMK 分为三个进程 - AMS 中设置lmk的6个内存阈值,以及更新每个进程/线程的adj值applyOomAdjLocked - lmkd是个单独的进程,socket监听,AMS发来的请求,更新内核的参数 - lowmemorykiller在内核中注册shrinker,利用内核的内存回收机制,根据lmkd中设置的参数执行lmk,先杀6个阈值中最大的(当内存低于80640个page时(3...

夏菠 453

透明大内存页Hugepage支持

在linux2.6.38之前,处理大容量内存工作集的高性能关键计算应用是运行在libhugetlbfs之上,必须依赖于 hugetlbfs,。透明Hugepage支持是一种替代手段,它使用大内存页,并且虚拟内存页的大小可以动态变化,没有hugetlbfs的缺点。 目前只适用于匿名内存映射,但未来可以扩展到tmpfs的papecache层。 大内存页的优点: 巨大的页面可以通

Lv的程序人生 2566

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

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

wdjjwb的专栏 1万+

大页面和透明大页面

内存是由块管理,即众所周知的页面。一个页面有 4096 字节。1MB 内存等于 256 个页面。1GB 内存等于 256000 个页面等等。CPU 有内嵌的内存管理单元,这些单元中包含这些页面列表,每个页面都使用页表条目参考。 让系统管理大量内存有两种方法: 增加硬件内存管理单元中页表数 增大页面大小 第一个方法很昂贵,因为现代处理器中的硬件内存管理单元只支持数百或

4673

【转载】巨页的原理分析

巨页的原理分析 巨页的原理,概括起来,就是在内核页面大小一定的情况下,分配物理地址连续的多个页框,模拟出一个大页面供用户态程序访问,从而减少用户程序缺页次数,提高性能。   为了让内核将这连续的多个页框视为一个整体,各个CPU架构分别做了手脚。 首先,hugetlbfs并不支持read/write。   实际上,巨页的使用,是通过用户态mmap一个hugetlbfs文件,然后第一次访问时缺

taozhiying520的博客 5938
上一篇: LWN:让 i_version 更好!
下一篇: LWN:内核中Rust支持的下一步动作!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值