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

NUMA架构下的内存分配策略 NUMA下的内存分配策略 通常的内存分配策略我们已经有所了解了。UMA是统一内存访问,无论任何 CPU 执行操作,访问时间都相等。而NUMA是非统一内存访问,在不同的节点的访问速度不一样,离本地越远访问越慢。在NUMA上我们有不只一个节点,我们可以在不同的节点上分配内存。 内存分配和策略 通常NUMA下的内存分配有显式和隐式两种。 显式分配 显式分配即指定节点的分配函数,此类基础分配函数主要有2个:Buddy系统的 alloc_pages_node()和SLAB系统的kmem_cache_alloc_nod 阅读详情

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

NUMA policy and memory types

By Jonathan Corbet
July 16, 2021
DeepL assisted translation
https://lwn.net/Articles/862707/

非统一内存访问(NUMA, Non-uniform memory access)系统架构中,会将内存都跟系统的各个 "node (节点)"关联起来。CPU 也是从属于某个 node 节点的。如果 CPU 在访问的是属于同一个 node 的内存的话,访问速度比起访问其他 node 的内存会更快。这里的性能差异对于在 NUMA 系统上运行的程序有比较大的影响,因此内核为用户空间提供了许多方法来优化应用程序的行为。不过,NUMA 这个概念现在也正在进行扩展,人们也就需要新方法来控制内存的分配过程。因此引出了 multi-pefeenc memory policy 这组 patch 来满足这一需求。

Memory policies

从来没有一个放之四海而皆准的分配策略可以做到为所有场景下都提供最佳性能。如果一个应用程序可以完全在一个 NUMA 节点内运行的话,那么最好的策略就是分配的所有内存都要来自这个节点,这样一来,所有的访问都是本地访问(因此速度很快)。较大的应用程序则可能希望分配的内存都来自几个特定节点。除此之外其他的应用程序的最好策略可能就是在整个系统中分配内存,这样一来所有的 CPU 的性能表现就会基本一致,系统整体带宽也会最优。一般来说,内核不可以判定适合某个特定进程的最佳策略是什么。

因此,需要由 user space 来帮助 kernel 选择相应的内存分配策略,这里有两个系统调用可以提供帮助。set_mempolicy() 函数可以供调用线程(calling thread)用来设置默认的内存策略,而 mbind() 则为调用进程的地址空间中的某一个特定部分设置策略。这两个系统调用有许多可选参数。例如可以使用 MPOL_PREFERRED 来要求内核在可能的情况下优先在一个 "preffered" node 上分配内存。进程也可以使用 MPOL_BIND 来提供一组节点列表,来指定内存分配都要来自这些特定节点。MPOL_INTERLEAVE 则要求内核在内存分配时每个 page 都分散到指定的节点上。还有一些其他类似策略。

这些选项通常来说足以满足那些需要性能调优的应用程序了。至少,它们曾经是足够了。但是现在内存技术正在发生一些变化。内核对 NUMA 的支持当初设计的时候世界还是这么一个情况:连接到任何一个系统上的内存都是同样的规格,影响性能的唯一关键就是内存连接的是哪个节点。当时人们唯一感兴趣的参数就某块内存区域对 CPU 来说是不是算是本地访问。

The plot thickens

然而,现在越来越多的系统都拥有多种类型的内存了。目前最常见的例子是安装了持久性内存(persistent memory)的系统。虽然这种内存可以用来作为长期存储设备,但它也可以作为一种速度比较慢的普通 RAM 来使用。持久性内存的优点是相对便宜,安装了大量持久性内存的话,可能就可以补足它在许多场景中较低性能的缺点了。同时,供应商也在研发一些比普通 DRAM 更快的高性能内存,但这类内存还是太贵了,不能把系统中的全部内存都完全替换成这种高性能的内存。

这就给内核(和用户空间)提出了一个以前不需要考虑的问题:应该使用哪种类型的内存来满足分配请求?到目前为止采用的解决方案是将这些特殊的内存都统一用一些特殊的、不包含 CPU 的 NUMA 节点中管理起来。如果某个应用程序知道自己需要大量的慢速内存的话,就可以设置其内存策略来从相应的节点中分配内存,这样就能拿到慢速内存了。

不过,以这种方式来使用现有的 NUMA 框架的话有一个小问题:它跟人们想解决的问题不是非常匹配。一个愿意使用慢速内存的应用程序就像是一个经济舱的乘客,如果在分配内存(登机)时给它进行一下升级(升舱),它肯定会喜出望外。因此该应用程序虽然可能会建议从慢速内存节点来进行分配,但如果慢速内存中空间不够了的话,应该回到正常内存来进行分配。

MPOL_BIND 的定义中不允许这种行为,因为它的判定更加严格。如果申请的策略是 MPOL_BIND,而在指定的节点上没有可用的内存的话,就会出现一些人们通常不愿看到的结果。比如 out-of-memory killer 进程会开始杀死一些进程来回收内存,此外也可能想要分配内存的这个进程会意外收到 SIGSEGV 信号。进程愿意使用较慢的内存,并不代表它们就希望在这部分内存不可用的时候看到自己进程崩溃,所以用户认为 MPOL_BIND 有点太过于死板来,他们的看法也是很有道理的。

某种意义上来说,MPOL_PREFERRED 似乎是这里比较适合的选项。它表达了一种偏好,如果首选节点没有可用的内存,就可以不用这个节点。问题是,由于一些只有该接口的设计者知道的原因,MPOL_PREFERRED 只允许指定一个 preferred 节点。如果所需的内存分布在多个节点上的话(这种情况很可能会发生),那么这个接口就无法让一个应用程序利用到所有的内存了。

Multi-preference policies

Multi-preference memory policy patch set 来自于 Feng Tang、Dave Hansen 和 Ben Widawsky 的工作,它试图通过增加另一个叫做 MPOL_PREFERRED_MANY 的选项来解决这个问题。它的行为与 MPOL_PREFERRED 类似,只是它允许指定多个节点。使用这个选项的程序可以要求从一组提供了所需类型的内存的节点中进行分配,但是如果这些节点中的资源不足了的话,内核可以从其他地方进行分配。这个 patch 本身是比较简单的,尽管它确实需要一些开发工作来修改所有需要使用这个新选项的地方的代码。

这项工作解决了眼前的问题,但它事实上回避了一个相关问题:NUMA 的抽象是不是用来解决这种选择不同类型内存的需求的最合适的方案呢?有人赞成,因为:这种方式现在就可以正常用起来,不需要一个全新 API 来管理内存分配,而且通常也跟底层硬件实际体系架构是相匹配的。反对者则认为,它事实上把两个无关的问题(内存类型和位置)混在了一起,并迫使用户空间的代码来解决这些问题。这令人感觉有点不太合适。

这已经不是第一次提出这种问题了,但人们仍然不太希望增加新的 API。历史经验表明,只要 NUMA API 可以用来解决选择内存类型的问题的话,就不会有很大的动力去开发其他方案来解决这个问题。因为潜在的好处可能比不上需要付出的大量额外成本。所以 MPOL_PREFERRED_MANY 可能会是最终的解决方案。patch set 似乎已经准备好了,这个新增选项可能很快就会出现在 5.15 的 mainline kernel 中。

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

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

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

Linux内核:内存——NUMA架构的优缺点 取值范围是0~100,vm.swappiness的值越低,Linux内核会尽量不进行swap交换页的操作,vm.swappiness的值越高,Linux会越多的使用swap空间。假设这个节点的本地内存为10GB,而MySQL配置20GB内存,超出节点本地内存部分(20GB-10GB)Linux会使用swap而不是使用其他节点的物理内存。最快(不经过互联模块),访问非本地节点的内存速度较慢(需要经过互联模块),即CPU访问内存的速度与节点的距离有关,该距离成为Node Distance。 阅读详情

相关推荐

linux内核那些事之内存规整(memory compact)

内存规整是Mel Gormal开发防止内存碎片anti-fragmen pach补丁的第二个部分Avoiding fragmentation with page clustering v27 [LWN.net],主要用于解决当系统长时间运行之后,造成比较碎化内存时,通过内存规整将处于可以移动MOVE的类型内存,重新进行页迁移 整合出较大连续物理内存: 内存规整机制原因比较简单: 利用类似快慢指针技巧,当需要对一个zone进行内存规整时,使用migrate_pfn和free_pfn两个遍历; m

weixin_42730667的博客 2089

numactl 设置numa内存分配规则

内核也有对应的枚举类型,include/uapi/linux/mempolicy.h。1. 缺省(default):总是在本地节点分配(分配在当前进程运行的节点上);4. 优先(preferred):在指定节点上分配,失败则在其他节点上分配。3. 交叉(interleave):在所有节点或者指定的节点上交织分配;2. 绑定(bind):强制分配到指定节点上;numactl分配的内存策略,

gjioui123的博客 4099

第九章 GPU 虚拟地址空间管理:9.2 GPU 内存管理与 CPU MM 的对照

本章对比 CPU 内存管理与 DRM GPU 虚拟地址空间(drm_gpuvm)在地址空间、后备存储、回收及失效恢复四方面的异同。二者均需在有限物理内存下管理多上下文虚拟地址,但 GPU 因硬件约束(如不可缺页、异步迁移)而演化出不同机制:用户态指定地址、提交前集中放置、基于 fence 的异步驱逐与恢复。核心差异源于 GPU 不支持缺页恢复,驱动需通过“提交式”、“长时运行”或“缺页”三种模式实现映射管理,体现 GPU 内存模型对硬件特性的依赖。

图形/计算GPU的驱动与虚拟化技术分享园地 708

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

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

glmwu的专栏 1万+

Vivado时序约束实战:input_delay在高速接口设计中的关键作用

本文深入探讨了在Vivado时序约束中,input_delay对于高速接口设计的关键作用。通过一个RGMII以太网接口调试的实际案例,解释了为何仅靠仿真正确而实际数据采集会失败,并揭示了set_input_delay约束的本质是告知时序分析工具外部芯片的时序关系,而非添加物理延迟。文章详细讲解了如何根据数据手册计算约束值、针对不同采样时钟方案(如移相时钟)进行约束,并指导如何通过时序报告验证约束效果,是解决FPGA高速接口时序问题的实战指南。

ee345的博客 252

LT9611EX芯片实战:如何用双端口MIPI转HDMI1.4打造高清播放器(附配置代码)

本文详细介绍了如何使用龙迅半导体的LT9611EX芯片实现双端口MIPI转HDMI1.4的高清播放器开发。内容涵盖芯片特性、硬件设计要点、寄存器配置技巧及完整代码实现,特别适合嵌入式视频处理应用,如机顶盒和便携式媒体播放器。

weixin_29256771的博客 321

关于NUMA架构的使用

当前大多数的PC机都是NUMA架构的,numa架构可以参考 http://www.fmslib.com/fmsman/doc/numa.html NUMA的架构的内存分配有以下四种: 1、default,总是分配在进程运行的节点上的内存,这是默认值 2、bind,强制把进程绑定到指定的CPU节点,进行内存分配 3、interleave,在所有节点上交织分配 4、preferred,在指

云计算、分布式架构、K8S、大数据、机器学习、搜索、推荐、广告 2257

华为昇腾服务器npu中安装paddle,pytorch等环境,训练代码迁移适配等问题记录

参考文档:https://github.com/PaddlePaddle/PaddleCustomDevice/blob/develop/backends/npu/README_cn.md

qq_29220369的博客 4112

LWN:针对多层内存系统重新进行NUMA平衡!

关注了就能看到更多这么棒的文章哦~NUMA rebalancing on tiered-memory systemsMay 2, 2022This article was contributed by David VernetDeepL assisted translationhttps://lwn.net/Articles/893024/传统的 NUMA 架构是围绕 n...

Linux News搬运工 1200

BitLocker磁盘锁定解决方法

摘要:本文介绍了BitLocker加密磁盘被锁的两种情况及解决方法。对于系统盘锁定,建议在微软账户中查找48位恢复密钥;数据盘锁定可尝试密码或恢复密钥解锁。若密钥丢失,可通过IT支持或数据恢复服务尝试解决。预防措施包括妥善备份密钥到微软账户和离线位置,避免随意更改系统硬件配置。BitLocker安全性高,恢复密钥是解锁关键,提醒用户务必做好备份以防数据丢失。(148字)

yueke06442300的专栏 2670

【系统分析师】写作框架:软件设计模式及其应用

本文围绕"软件设计模式及其应用"展开论述。首先介绍了近三年参与的某软件开发项目背景及个人承担的系统设计工作。其次系统阐述了设计模式的三大分类:创建型(如工厂方法、单例模式)、结构型(如适配器、装饰器模式)和行为型(如观察者、策略模式),重点分析了各类模式的特点和典型应用场景。最后结合项目实践,详细说明了采用的三种设计模式的具体实施过程及效果,包括提高代码复用性、降低耦合度等优势。文章还总结了项目经验,指出存在的不足及改进方向,强调合理运用设计模式对构建高质量软件系统的重要性。全文通过理论

数据知道的博客 5060

LWN:内存分层下的加权交错分配!

关注了就能看到更多这么棒的文章哦~Weighted interleaving for memory tieringBy Jonathan CorbetOctober 25, 2023ChatGPT translationhttps://lwn.net/Articles/948037/kernel里过去这些年一直都可以控制如何在有多个NUMA node的系统里进行内存分配。最近NUMA node已经...

Linux News搬运工 1041

结合MATLAB/Simulink和多体动力学仿真软件UM(Universal Mechanism),建立高速列车轴箱轴承的动力学模型,并通过联合仿真分析其正常运行特性和典型故障模式

高速列车是现代交通运输的重要组成部分,其运行速度高、载客量大,对安全性和可靠性提出了极高的要求。轴箱轴承作为高速列车的关键部件之一,承担着传递载荷和支撑车轴的重要作用。然而,由于长期运行在高速、重载和复杂工况下,轴箱轴承容易出现疲劳磨损、润滑失效和裂纹等故障,从而影响列车的安全性。本项目旨在结合MATLAB/Simulink和多体动力学仿真软件UM(Universal Mechanism),建立高速列车轴箱轴承的动力学模型,并通过联合仿真分析其正常运行特性和典型故障模式。

xiaoheshang_123的博客 329

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

关注了就能看到更多这么棒的文章哦~Some upcoming memory-management patchesBy Jonathan CorbetNovember 12, 2021Dee...

Linux News搬运工 404

AI 大模型应用数据中心的数据清洗工具

1. 背景介绍 在人工智能大模型应用的浪潮中,数据清洗作为数据预处理的重要环节,对于提升模型性能和可靠性具有至关重要的作用。数据中心作为人工智能模型的运行环境,面临着海量数据流和多样化的数据类型,如何高效、准确地进行数据清洗,成为应用大模型的关键问题之一。本文将详细介绍AI大模型应用数据中心的数据清洗工具,包括核心概念、算法原理、具体操作步骤、应用场

SuperAGI2025 1803

软考高级架构师笔记-10数学计算题

专栏《软考高级架构设计师》更新了,本章列举了10个场景计算题的解法,温故而知新,大家快来卷一卷

java后端开发的博客,不仅仅是后端开发 1597

LWN:内核中进行更积极地内存整理(compaction)

关注了就能看到更多这么棒的文章哦~Proactive compaction for the kernelApril 21, 2020This article was contribute...

Linux News搬运工 2109

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LWN:CXL 如何管理以及分层!

关注了就能看到更多这么棒的文章哦~CXL 1: Management and tieringBy Jonathan CorbetMay 13, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/894598/Compute Express Link(CXL)是一项新出现的内存技术,显然是 Linux 内...

Linux News搬运工 2523

SAP B1中文培訓教材_SDK

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

jre9下载 jdk9

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

LWN: 评评理应该牺牲谁的performance

点击上方蓝色字关注我们~Dueling memory-management performance regressionsByJonathan CorbetJune 1...

Linux News搬运工 224

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LWN:hybrid scheduling更加复杂了!

关注了就能看到更多这么棒的文章哦~Hybrid scheduling gets more complicatedBy Jonathan CorbetSeptember 30, 2022LPCDeepL assisted translationhttps://lwn.net/Articles/909611/10 多年前新出现的 Arm big.LITTLE 架构给内核的 CPU 调度器(schedu...

Linux News搬运工 414

LWN:两组跟memory-tier有关的patch!

关注了就能看到更多这么棒的文章哦~Two memory-tiering patch setsBy Jonathan CorbetJune 27, 2022DeepL assisted translationhttps://lwn.net/Articles/898766/很久以前,计算机只有一种类型的内存 memory,所以一个特定系统内的内存是可以互相替换使用的。非统一内...

Linux News搬运工 831

LWN:6.17 合并窗口的后半部分!

网络*:Qualcomm IPQ5018 内部 PHY、Airoha AN7583 MDIO 总线控制器、Broadcom 50/100/200/400/800 千兆以太网卡、Microchip Azurite DPLL/PTP/SyncE 设备以及 Realtek 8851BU 和 8852BU USB 无线网络 (Wi-Fi 6) 适配器。供电设备 (PSE) 实现增加了对可配置预算评估策略的支持,这些策略“被 PSE 控制器用于在功率预算超出等情况下决定首先关闭哪些端口”。详情请参阅 此合并消息。

Linux News搬运工 1800

极客时间-左耳听风-程序员攻略-Linux系统、内存和网络

另外,本书针对当前网络应用中日益突出的安全问题,用了一整章的篇幅对计算机网络的安全性进行了深入讨论,而且把相关内容与最新网络技术结合起来阐述。,这是 HTTP 的一个比较新的协议,它于 2015 年被批准通过,现在基本上所有的主流浏览器都默认启用这个协议。下面是相关的学习资源。读 RFC 有几个好处,一方面可以学习技术,另一方面,你可以通过 RFC 学习到一个好的技术文档是怎么写的,还能看到各种解决问题的方案和思路。这本书中没有提到 HTTP/2 的事,但是可以让你了解到 HTTP 协议的绝大多数特性。

2401_88755455的博客 827

【翻译】 瞬时数据的持久存储器

LWN 订阅者的好处订阅《LWN》的主要好处是帮助我们继续出版,除此之外,订阅者还可以立即访问网站的所有内容,并使用网站的一些额外功能。 请立即注册! 作者:乔纳森-科贝特2019年1月21日 可以说,持久性内存最显著的特点就是它的持久性:它可以在电源周期中保留其内容。 据说,这些持久内存阵列很快就会随处可见,它们的另一个重要方面是体积...

超级码力 3029

LWN: 更加不对称的Arm系统上如何调度?

关注了就能看到更多这么棒的文章哦~Scheduling for asymmetric Arm systemsBy Jonathan CorbetNovember 30, 2020Deep...

Linux News搬运工 201
上一篇: LWN:让 GitHub 帮我编程!
下一篇: LWN: 名为 Sequoia 的 seq_file 漏洞!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值