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

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

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

Multi-size THP creation, two different ways

By Jonathan Corbet
February 13, 2025
Gemini-1.5-flash translation
https://lwn.net/Articles/1009039/

Huge pages (巨页)可以提升许多程序的性能,但它们本身也可能带来不利的性能影响。在过去的几年里, multi-size transparent huge pages (mTHPs) (多尺寸透明巨页)越来越被视为一种折衷方案,它以较低的成本带来了巨页的优势。然而,如果系统不创建 mTHP,就无法从中受益;两位开发者分别发布了补丁,以在后台启用 mTHP 的创建。

Huge pages (巨页)

Huge pages (巨页)是由 CPU 及其 memory-management unit (内存管理单元)实现的一项功能;它使系统能够以混合的页面大小运行。然而,这些大小在数量上受到限制,并且完全由 CPU 的内存架构定义;它们对应于 page-table hierarchy (页表层级)的级别。作为提醒,该层级结构大致如下(来自 这篇 2013 年的文章):

fc665fe3ee9edf8a0cd5be6fa8875a89.png

(更现代的系统还可以在层级的顶部下方有 另一层)。

在 x86 系统上, base-page (基本页)大小为 4KB。第一级 huge pages (巨页)是通过标记 page middle directory (PMD, 页面中间目录)层级,即位于最底部的 page-table entry (PTE, 页表条目)级别之上的那一层中的条目来实现的。然后, PMD 条目直接引用覆盖地址空间较大部分的页面,而不是 PTE 表。这导致页面大小为 2MB;这些页面通常被称为 "PMD huge pages (PMD 巨页)"。向上移动到下一级目录 page upper directory (PUD) (页面上级目录)产生 1GB 的 huge pages (巨页)。

以这种方式实现的 huge pages (巨页)具有一些显著的优势。单个 PMD huge page (PMD 巨页)取代了 512 个 base pages (基本页),显著降低了内存管理的开销以及系统必须处理的 page faults (缺页中断)的数量。它还释放了 translation lookaside buffer (TLB) 中的多达 512 个条目, TLB 是一种稀缺的处理器资源,通常可能是性能瓶颈。因此,使用 huge pages (巨页)的程序可以运行得更快。最初,使用 huge pages (巨页)需要开发者和系统管理员付出特别的努力; 2011 年 transparent huge pages (THPs) (透明巨页)的添加使内核能够在后台将进程的 base pages (基本页) coalesce (合并)成 huge pages (巨页),从而使整个系统都可以获得 huge pages (巨页)的性能优势。

不幸的是, huge pages (巨页)并非完全没有代价。使用 huge-page (巨页)的代价可能是 internal fragmentation (内部碎片);如果进程仅使用 huge page (巨页)的一部分,则其余部分将被浪费。因此,启用 transparent huge pages (透明巨页)可能会显著增加 workload (工作负载)的内存使用量;如果系统在没有 huge pages (巨页)的情况下接近其限制,则启用它们可能会使其超出限制。因此,发行商通常会禁用此功能,并且人们很容易在网上找到建议保持这种状态的建议。

The multi-size option (多尺寸选项)

Multi-size THPs (多尺寸 THP)正如其名称所示,是将 huge-page (巨页)的概念扩展到更多尺寸,即那些与 page-table hierarchy (页表层级)不对应的尺寸。 mTHP 概念是由 transition to folios (转换为页) 启用的,以此作为在内核中管理内存的一种方式;现在可以表示任意(尽管是 2 的幂)大小的物理上连续的页面组。使用 mTHP 将再次减少内存管理开销,因为它们可以作为一个单元而不是作为独立的 base pages (基本页)进行管理。更新的 CPU 添加了 TLB-coalescing (TLB 合并)功能,该功能允许一个 8 页(x86)或 16 页(Arm)的 mTHP 由单个 TLB 条目表示,从而提高了 mTHP 可以带来的性能优势。

因此,使用 mTHP 可以带来与传统 huge pages (巨页)相似的性能提升,但 internal-fragmentation (内部碎片)成本更低。对于内核而言,分配 mTHP 也比分配完整的 PMD 或 PUD huge page (巨页)容易得多,尤其是在系统已经运行一段时间并且内存已变得碎片化之后。因此,近年来,人们为提高内核使用 mTHP 的能力付出了相当多的努力,这并不奇怪。

THP 页面机制可以通过几种方式将 huge pages (巨页)注入到进程的地址空间中。其中一种是在最初分配页面时。例如,内核可以分配一个 huge page (巨页)并在单个操作中读取所有内容,而不是使用 base page (基本页)来满足 page fault (缺页中断)。另一种方法是在后台检查进程的地址空间,并识别可以替换为 huge pages (巨页)的虚拟连续页面的范围。当找到这样的范围时,将分配一个 huge page (巨页),将 base pages (基本页)复制到其中,然后在 huge page (巨页)替换页表中的它们之后释放。后一个任务由 khugepaged 内核线程执行,该线程受益于能够观察进程实际使用的内存页面。但是, khugepaged 线程只能创建 PMD huge pages (PMD 巨页);它早于 mTHP,并且不创建它们。有问题的两个补丁集都旨在填补这一空白。

在研究它们之前,还有一些与这两种方法相关的有用背景知识。有一个 sysctl knob (sysctl 旋钮) max_ptes_none,它控制 khugepaged 可以分配多少新页面来创建 huge page (巨页)。例如,如果一个合适的地址空间范围包含 500 个 active pages (活动页面),则 khugepaged 必须分配 12 个额外的页面才能拥有组成 PMD huge page (PMD 巨页)的完整 512 个页面。如果 max_pte_none 设置为至少 12,则 khugepaged 将继续,否则它将放弃该 huge page (巨页)。在 khugepaged 中创建 mTHP 会增加必须对此 knob (旋钮)的设置进行思考的量。

Improving khugepaged (改进 khugepaged)

来自 Nico Pache 的 第一个补丁集 更改了核心 khugepaged 扫描循环(在当前内核中称为 hpage_collapse_scan_pmd(),尽管该系列将其重命名为 khugepaged_scan_pmd() )。当前实现会立即停止扫描 candidate huge page (候选巨页),如果找到 max_pte_none 个 unmapped pages (未映射页面)。在修改后的版本中,它将扫描 huge page (巨页)的整个地址范围,并创建一个 bitmap (位图),标记可以在该页面中创建 mTHP 的位置。考虑的最小尺寸为 order 3 (8 个页面);将来可能会更改为允许 Arm 系统上的最小 order 4 ,与可以合并 TLB 条目的大小相匹配。

在确定是否可以将给定的 mTHP 大小的 chunk (块)转换为实际的 mTHP 时,该补丁会相应地缩放 max_pte_none 值。当查看一个 8 页的 chunk (块)时, max_pte_none 将除以 64 (512/8) 以确定必须实际存在多少页。

扫描 PMD 后, khugepaged 将首先考虑是否可以将整个内容转换为 PMD huge page (PMD 巨页)。如果失败,将查阅扫描期间创建的 bitmap (位图),以尝试创建尽可能大的 mTHP,具体取决于实际驻留在内存中的页面。处理完 bitmap (位图)并创建任何 mTHP 后, khugepaged 将继续扫描下一个 PMD。

这种方法存在一个问题,两个补丁集都必须解决;它被称为 "creep (蔓延)"。假设 max_pte_none 已设置为 511,这恰好是其默认值。在该设置下,即使是单个 resident page (常驻页面)也足以导致 khugepaged 填充 huge page (巨页)的其余部分,这很可能是用户想要的。但是,在处理 mTHP 时,情况会发生一些变化。扫描 PMD 时,每个单页都会导致创建 8 页的 mTHP,正如预期的那样。但是,下次扫描发生时,这些 mTHP 将各自转换为 16 页的 mTHP,因为每个 mTHP 都包含足够的页面以使 khugepaged 将它们提升到下一个大小。

随着时间的推移,这些 mTHP 都将 "creep (蔓延)" 到 PMD 大小,而这正是创建补丁集要避免的结果。为防止这种情况发生,管理员需要将 max_pte_none 设置为小于 PMD huge page (PMD 巨页)大小一半的值,即 255 或更小的值。

来自 Dev Jain 的 第二个补丁系列 采用了一种略有不同的方法。 khugepaged 首先像以前一样以 PMD 大小的 chunk (块)进行扫描,但是如果无法 collapse (合并)给定的 PMD 范围,它将下降到一个较小的 order (阶)并再次尝试。 实现此算法的代码 是一堆 goto 语句,有点难以理解,但其目的是以导致成功创建 mTHP 的大小扫描每个内存范围。完成 PMD 条目后, order (阶)将重置为最大值以启动下一个条目。

该系列对 creep (蔓延)问题采取了更严格的方法;仅当 max_ptes_none 设置为零或 511 时,它才会执行 mTHP collapse (合并)。在前一种情况下,仅当它将替换的所有 base pages (基本页)都已经存在时,才会创建 mTHP;在后一种情况下,明确允许 creep (蔓延)到完整的 PMD 大小。

Pache 发布了 另一个补丁集,该补丁集可以与任何一个khugepagedmTHP 实现一起使用。在当前内核中,可以通过一组 sysctl knobs (sysctl 旋钮)显式启用或禁用各种大小的 mTHP(在Documentation/admin-guide/mm/transhuge.rst中有文档记录)。always的设置会导致内核尝试创建该大小的 mTHP,而never会禁用该大小。 Pache 添加了一个新的defer设置,该设置将导致内核不使用给定大小来响应 page faults (缺页中断),但将允许khugepagedcollapse (合并)到该大小。此处的目的是将 mTHP 分配限制在已证明有用的内存中,希望在享受 mTHP 优势的同时进一步降低 mTHP 的使用成本。

截至撰写本文时,这两个补丁集都是新发布的;除了 Andrew Morton 请求 基准测试结果之外,尚未产生任何真正的审查讨论。因此,无法预测哪个(如果有的话)补丁集将被接受,或者在发生这种情况之前可能需要进行多少更改。但是,人们显然希望更好地利用 mTHP,因此这项工作背后的目标很容易理解;迟早,内核几乎肯定会获得某种在进程运行时在后台创建 mTHP 的能力。

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

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

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

3516786f980c38151ffe54a931721df9.jpeg

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

相关推荐

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

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

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

qq_20408423的博客 9371

ArcGIS山体坡度、坡向分析

本篇文章主要记录自己在对山体坡向及坡度分析中的一些操作。

Belence_zhao的博客 7410

linux内核源码分析之巨型页

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

3917

SpringBoot+Git+Jenkins+K8s容器化部署

SpringBoot+Git+Jenkins+K8s容器一套部署流程

可乐加.糖 470

DIY等离子环:从Class-E电路到七彩辉光,手把手教你打造炫酷科学玩具

本文手把手教你DIY一个炫酷的等离子环科学玩具。从解析等离子体辉光放电原理入手,详细介绍了核心的Class-E自激振荡电路设计、关键元件选型与参数计算,并提供了从物料准备、电路搭建、腔体密封到上电调试的全流程指南。通过调制电路或填充不同气体,还能实现七彩变换与交互效果,是学习高频电路与电磁场知识的绝佳实践项目。

weixin_29305337的博客 633

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

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

zf1575192187的专栏 1364

基于QEMU的openEuler aarch64虚拟机快速部署与漏洞验证指南

本文提供了一份基于QEMU在个人电脑上快速部署openEuler aarch64虚拟机的详细指南。内容涵盖从软件准备、目录规划、QEMU安装、虚拟磁盘创建到系统安装与SSH配置的全过程,并以CVE-2024-1086内核漏洞为例,演示了如何在该虚拟环境中进行安全漏洞的验证与补丁测试,为安全研究和运维测试提供了一个低成本、高效率的ARM架构沙箱环境。

earth的博客 438

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

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

qq_50247813的博客 485

PCIE Lane Margining Linux 环境配置

Copy all the provided files in folder PYC38 or PYC310 to the created pcie_lmt folder. Index of /ftp/python/3.8.10/Copy below commands to a file and rename it as "scan_pcie.py", the commands are from "685662 PCIe-LMT-Gen4_Gen5-r0p77.pdf" in the lane margi

mysongshine的博客 1435

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3647

2024年Linux内核十大技术革新盘点|年终盘点

【优快云 编者按】岁末年初,Linux内核2024年度盘点如约而至。继《2022 Linux内核十大技术革新功能 | 年终盘点》、《熠熠生辉 | 2023 Linux 内核十大技术革新功能》之后,知名Linux内核一线开发者,经典书籍《Linux 设备驱动开发详解》作者宋宝华老师又给大家带来了2024年Linux内核开发中,十个最典型的patchset,为大家呈现干货满满的硬核技术年货。作者 |...

优快云资讯 6060

向华为学习——IPD流程体系之IPD术语

《IPD体系核心概念与业务术语解析》摘要: IPD(集成产品开发)是一种以市场为导向的结构化产品开发管理模式,通过跨部门协作、异步开发、CBB(通用构建模块)和管道管理等手段,实现产品全生命周期高效管理。体系包含七大核心要素:跨部门团队(如IPMT决策层、PDT执行层)、结构化流程(分阶段评审)、端到端项目管理(WBS分级计划)、客户需求分析、投资组合优化及质量管控(TR技术评审)。各业务领域术语涵盖财务(NPV、IRR)、开发(需求分解、基线化)、制造(可制造性设计)、采购(Sourcing团队)及市场(

cdfunlove的博客 480

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux 多阶透明大页(mTHP)深度解析

虚拟页是将用户态虚拟地址空间划分成固定大小的块,与物理页类似,用于地址映射管理。

Angelica_0v0的博客 1219

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

内存管理:巨页HugePage

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

weixin_71478434的博客 2204

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万+

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

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

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

wdjjwb的专栏 1万+

Linux 关于Transparent Hugepages的介绍

透明大页介绍 Transparent Huge Pages的一些官方介绍资料: Transparent Huge Pages (THP) are enabled by default in RHEL 6 for all applications. The kernel attempts to allocate hugepages whenever possible and any Li

谭成 2754

【转载】巨页的原理分析

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

taozhiying520的博客 5938

LInux 标准大页和透明大页

阅读目录 Huge Pages Transparent Huge Pages 使用Huge pages优点 使用Huge pages缺点 Transparent Huge pages存在的问题 如何关闭Transparent Huge pages ? Huge pages (标准大页)和Transparent Huge pages(透明大页) 在Linux中大页分为两种:Huge pages (标准大页)和Transparent Huge pages(透...

Data & Analysis 1677

大页面和透明大页面

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

4673

透明大页

透明大页(transparent hugepages)和普通大页的区别是,透明大页 可以实时配置,不需要重启配置就可以生效,第二个是,利用khugepage thread 分配,不用在开机的时候预留,第三是透明大页 不再依赖hugetlbfs。透明大页映射的时机有两个。 要使用透明大页,就需要想之前一样通过通过 mount hugetlbfs。来实现,而是通过user space使用的时候调用f

jason的笔记 5908

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 344
上一篇: LWN:emlearn 进行毫瓦级别的机器学习!
下一篇: LWN:systemd的14年!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值