当前位置: 首页 > article >正文

linux内核源码内存管理(7)

一、 引言冲破冯·诺依曼瓶颈的壁障在传统的单处理器UMAUniform Memory Access架构中所有CPU核心通过同一条总线平等地访问所有内存。这种对称性带来了编程模型的简洁但也埋下了致命的可扩展性陷阱随着CPU核心数量的增加内存总线成为唯一的拥堵点争抢带宽的CPU们陷入了“吵杂混乱”的境地。NUMANon-Uniform Memory Access非统一内存访问架构正是为了打破这一瓶颈而诞生的。它放弃了“所有内存平等”的幻想转而拥抱“就近原则”将CPU分组称为Socket或Node每组CPU直接连接本地物理内存形成本地内存Local Memory访问速度快访问其他组的内存则需通过互联通道如Intel QPI或AMD Infinity Fabric形成远端内存Remote Memory访问速度慢且延迟高。对于Linux内核而言NUMA不仅仅是一种硬件特性更是一场内存管理哲学的变革。它迫使内核从“盲目分配”进化为“拓扑感知”从“全局统一”进化为“局部自治”。本部分将深入剖析Linux如何在NUMA的复杂地形中通过精密的策略和算法驾驭从双路服务器到八路乃至更多的大型系统。二、 NUMA硬件基础与抽象模型2.1 硬件拓扑Socket、Die与NUMA节点现代多路服务器的硬件拓扑远比简单的“几个CPU插槽”复杂Socket插槽主板上的物理CPU封装。双路系统有2个Sockets。Die晶粒单个物理CPU封装内可能包含多个Die如AMD Zen架构的CCD/IOD。NUMA Node节点内核视角的内存连贯域。一个Node包含一组CPU及其直连的物理内存。在多Die架构中单个Socket可能包含多个NUMA Nodes。关键指标本地访问延迟Local Latency基准单位通常约90-100纳秒。跨节点延迟Remote Latency通常比本地高出1.5倍至2倍约130-180纳秒。跨节点带宽受互联总线限制远低于本地带宽。2.2 Linux的NUMA软件抽象为了屏蔽硬件多样性Linux构建了一套统一的软件抽象pg_data_t(pglist_data)如前所述这是描述一个NUMA节点的核心数据结构。系统启动时固件ACPI SRAT表或硬件发现机制会告诉内核有多少个Nodes。struct numa_node在CPU调度域中也维护NUMA拓扑信息。距离矩阵Distance Matrix内核通过/sys/devices/system/node/nodeX/distance导出节点间的“远近”关系。通常本地节点距离为10跨Socket节点距离可能为20或更高。三、 NUMA分配策略从盲猜到感知内核分配物理页时必须决定从哪个Node取页。这绝非随机选择而是遵循严格的策略体系。3.1 默认策略本地优先Local Allocation默认情况下GFP_KERNEL等标志Linux采用本地优先策略当进程在某个CPU上运行并触发分配时内核首先尝试从该CPU所属的NUMA节点分配。如果本地节点内存不足则根据Zonelist顺序回溯到其他节点通常是距离最近的节点。优势最大限度地利用CPU缓存局部性减少跨节点访问延迟。3.2 内存策略Memory Policy与 MPOL用户可以显式指定更复杂的策略这是通过Memory Policy机制实现的。策略可以绑定到进程的虚拟地址范围VMA。关键策略类型include/linux/mempolicy.hMPOL_BIND绑定强制内存只从指定的Node集合分配。用于将关键数据锁定在快速内存。MPOL_PREFERRED首选优先从指定Node分配失败则回退。MPOL_INTERLEAVE交错在指定Node集合间轮询分配页。这能将内存访问压力均匀分摊到多个节点最大化聚合带宽适合大流量的顺序读写。MPOL_LOCAL本地默认策略优先本地Node。MPOL_DEFAULT回退到系统默认行为。用户态控制通过set_mempolicy()系统调用或numactl命令设置。四、 自动NUMA平衡AutoNUMA内核的自我治愈仅仅靠初始分配策略是不够的。进程可能被调度器迁移到不同Node的CPU上导致它访问的数据留在了原来的Node造成“异地恋”般的性能损耗。为此Linux引入了自动NUMA平衡AutoNUMA机制。4.1 核心原理页面迁移Page MigrationAutoNUMA的核心能力是将物理页从一个Node移动到另一个Node而无需改变进程的虚拟地址。技术实现缺页异常采样当进程访问一个页时内核记录该页的访问模式。NUMA Hinting Faults利用现代CPU的硬件特性如Intel的Imprecise Transactional Memory或AMD的Next-Generation在TLB未命中时提供访问来源信息。迁移守护进程numad/khugepaged扩展内核线程周期性地扫描内存访问统计如果发现某个页被远端CPU频繁访问而本地Node有空闲内存则发起迁移。4.2 迁移流程详解锁定页将要迁移的页锁定防止并发修改。分配目标页在目标Node上分配一个新的物理页。复制内容使用copy_page()或硬件加速如Intel CAT复制数据。更新页表将进程页表中的PTE指向新物理页刷新TLB。释放旧页将原Node的旧页释放回伙伴系统。4.3 透明大页THP的NUMA挑战THP2MB/1GB页极大地提高了TLB效率但对NUMA迁移构成了严峻挑战迁移开销大迁移2MB数据比迁移4KB数据慢得多。碎片风险目标Node必须有连续的2MB空闲内存。因此内核的khugepaged在尝试合并大页时必须审慎考虑NUMA亲和性有时宁可保持小页也不创建跨Node的大页。五、 CPUsetsCPU与内存的联合隔离NUMA管理常与CPU绑定协同使用。CPUsets子系统允许将系统划分为多个CPU和内存的互斥子集。关键应用隔离计算密集任务将一组CPU和对应的本地Node内存分配给一个高优先级任务确保其不受其他任务干扰。防止缓存污染确保L3缓存不被无关进程冲刷。配置文件示例/sys/fs/cgroup/cpuset/cpuset.cpus允许运行的CPU列表。cpuset.mems允许分配内存的Node列表。cpuset.cpu_exclusive是否独占CPU。cpuset.mem_exclusive是否独占内存。警告错误的CPUSet配置可能导致内核无法在指定Node分配内存触发意外的OOM。六、 NUMA与虚拟化/容器化的交织在云原生时代NUMA的影响穿透了层层抽象。6.1 虚拟机的NUMA虚拟化Hypervisor如KVM/QEMU可以向Guest OS暴露虚拟的NUMA拓扑vNUMAVirtual NUMAGuest OS看到的是虚拟NodeHypervisor负责将Guest的虚拟Node映射到Host的物理Node。挑战如果Hypervisor的映射策略不佳如将Guest的两个vNode映射到Host同一个物理Node的远端内存Guest内的AutoNUMA可能做出错误决策。6.2 容器与Cgroup的NUMA扩展Cgroup v2对NUMA的支持日益增强cpuset控制器如前所述限制内存分配的来源Node。Memory Cgroup的NUMA统计memory.numa_stat文件显示容器内存在各Node的分布。策略传播在多层Cgroup中NUMA策略需要正确地向下继承或聚合。七、 性能监控与诊断工具箱NUMA性能问题的隐蔽性很强需要专门的工具透视。7.1numastat节点级统计这是最基础的NUMA监控工具显示各Node的内存分配状况。$ numastat Node 0 Node 1 Num_Total_Pages 1048576 1048576 Free_Pages 1024000 1032192 Anon_Pages 2048 5120 File_Pages 20480 8192 ...关键指标如果Anon_Pages进程私有内存在某Node异常低而进程却在运行说明可能有大量的远端访问。7.2numactl策略控制与报告numactl是用户态管理NUMA策略的瑞士军刀。查看硬件拓扑numactl --hardware绑定进程运行numactl --cpunodebind0 --membind0 ./app交错分配numactl --interleaveall ./app适合内存带宽密集型7.3perf深度分析使用perf可以精确捕捉NUMA相关的硬件事件perf stat统计mem_load_retired.l1_miss和mem_load_retired.remote_dram等事件量化远端访问比例。perf c2c分析缓存一致性Cache-to-Cache问题识别“错误共享”False Sharing导致的跨Node缓存行乒乓。7.4/proc/pid/numa_maps这是最详细的进程级NUMA视图展示了进程地址空间中每一段内存分布在哪个Node上。00400000 default file/bin/bash mapped1 N11 7f3ac0000000 default heap mapped45 N043 N12 ...显示堆内存有43页在Node02页在Node1。八、 架构图Linux NUMA管理体系全景┌─────────────────────────────────────────────────────────────────┐ │ 系统物理拓扑 (2-Node NUMA System) │ │ ┌──────────────┐ Interconnect ┌──────────────┐ │ │ │ Node 0 │ (QPI/Infinity) │ Node 1 │ │ │ │ CPU0, CPU1 │ ◄────────────────────────► │ CPU2, CPU3 │ │ │ │ Local RAM │ │ Local RAM │ │ │ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ ▼ (Page Allocation) ▼ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ 伙伴系统 │ │ 伙伴系统 │ │ │ │ (Buddy) │ │ (Buddy) │ │ │ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ └──────────────────┬─────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Linux NUMA 核心管理层 │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ │ │ 内存策略框架 │ │ 自动NUMA平衡 │ │ │ │ │ │ (Memory Policy)│ │ (AutoNUMA) │ │ │ │ │ │ - MPOL_BIND │ │ - 访问采样 │ │ │ │ │ │ - MPOL_PREFER │ │ - 页面迁移 │ │ │ │ │ │ - MPOL_INTER..│ │ - 负载均衡 │ │ │ │ │ └──────┬─────────┘ └────────┬────────┘ │ │ │ │ │ │ │ │ │ │ │ │ (Policy Enforcement) │ │ │ │ ▼ ▼ │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ │ │ CPUSet │ │ 调度域 (Sched.) │ │ │ │ │ │ (CPU/Memory │ │ (Load Balancing)│ │ │ │ │ │ Isolation) │ │ │ │ │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ (Userspace Control) │ │ ▼ │ │ ┌──────────────┐ │ │ │ numactl │ set_mempolicy() │ │ │ libnuma │ mbind() │ │ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘图解说明底部硬件层两个Node通过互联总线连接。中层内核NUMA管理层包含策略框架决定“去哪拿”自动平衡决定“怎么搬”以及CPUSet进行资源隔离。上层用户态工具和API提供控制和观测接口。九、 最佳实践与性能调优9.1 数据库MySQL/PostgreSQL部署策略绑定与独占。操作# 将数据库进程绑定到Node 0的CPU且内存只从Node 0分配 numactl --cpunodebind0 --membind0 mysqld 理由数据库对延迟极度敏感跨Node访问带来的额外延迟是不可接受的。确保Buffer Pool完全位于本地Node。9.2 高性能计算HPC与科学模拟策略交错分配Interleaving。操作numactl --interleaveall ./hpc_app理由HPC应用往往需要巨大的内存带宽交错分配能让内存控制器负载均衡最大化吞吐量。9.3 通用应用服务器策略信任内核默认。操作保持默认设置开启AutoNUMA。理由对于工作负载多变、进程频繁迁移的场景内核的AutoNUMA通常比人工静态绑定更聪明。9.4 参数调整/proc/sys/vm/zone_reclaim_mode控制在Node内存不足时是优先回收本地内存还是去其他Node分配。/proc/sys/kernel/numa_balancing开关自动NUMA平衡功能通常保持为1启用。十、 小结与前瞻第七部分将我们的视野从单一的物理内存池拉升到了多节点、非对称的NUMA世界。我们看到了Linux如何通过抽象建模用pg_data_t和距离矩阵描述硬件拓扑。策略框架提供从绑定到交错的灵活内存放置策略。动态平衡AutoNUMA机制让内存追随CPU迁移实现动态最优。联合隔离CPUSets将CPU和内存绑定管理。未来趋势随着CXLCompute Express Link内存池化和异构内存HBMDRAM的普及NUMA的定义正在泛化。未来的Linux内存管理器不仅要感知CPU的距离还要感知内存介质的类型快慢实现真正的分层NUMATiered NUMA管理自动将热数据放入HBM温数据放入本地DRAM冷数据放入CXL扩展内存。在第八部分中我们将把镜头转向另一个关键领域内存监控、调试与性能分析的高级实战探讨如何使用perf、ebpf等现代化工具像法医一样解剖内存系统的每一个细微行为。

相关文章:

linux内核源码内存管理(7)

一、 引言:冲破冯诺依曼瓶颈的壁障在传统的单处理器(UMA,Uniform Memory Access)架构中,所有CPU核心通过同一条总线平等地访问所有内存。这种对称性带来了编程模型的简洁,但也埋下了致命的可扩展性陷阱&…...

AMD Ryzen处理器底层调试技术解析:SMUDebugTool的架构设计与实践应用

AMD Ryzen处理器底层调试技术解析:SMUDebugTool的架构设计与实践应用 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地…...

Python 开发者三步接入 Taotoken 调用 GPT 与 Claude 模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Python 开发者三步接入 Taotoken 调用 GPT 与 Claude 模型 对于习惯使用 OpenAI 官方 Python SDK 的开发者来说,接入 T…...

【亲测有效】DeepSeek极简入门与应用_156.[第6章 高级应用技巧] 场景描述型框架:用情境设定让AI进入最佳状态

别再让AI"猜谜"了!一个场景设定,让DeepSeek从"人工智障"秒变"懂王"——这可能是你用过最被低估的Prompt技巧 #mermaid-svg-7MQcGN4wm4OXCgus{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:1…...

apk 包管理器完全指南:Alpine Linux 的轻量级利器

一、apk 体系架构全景 apk(Alpine Package Keeper)是 Alpine Linux 的核心包管理工具,与 Debian 的 APT 相比,它遵循极简主义设计哲学:代码量少、依赖解析简单、资源占用极低。这使得 Alpine 成为 Docker 容器的默认基…...

黑苹果配置神器Hackintool:从新手到高手的完整指南

黑苹果配置神器Hackintool:从新手到高手的完整指南 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool Hackintool被誉为"黑苹果瑞士军刀",是配置和…...

ThinkPad风扇控制终极指南:TPFanCtrl2让笔记本更安静高效

ThinkPad风扇控制终极指南:TPFanCtrl2让笔记本更安静高效 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否经常被ThinkPad风扇的噪音打扰?…...

网安工具系列python系列【仅供参考】:Python实战:利用fofa API高效搜索网络资产

Python实战:利用fofa API高效搜索网络资产 Python实战:利用fofa API高效搜索网络资产 1. 从零开始:为什么你需要一个自动化的资产搜索工具? 2. 动手前的准备:你的fofa账户和Python环境 2.1 获取你的fofa API凭证 2.2 搭建Python脚本环境 3. 核心代码拆解:一行行理解搜索脚…...

移动篇:WMS里的“乾坤大挪移”——移库、补货、冻结全解析

WMS里的“乾坤大挪移”——移库、补货、冻结全解析 摘要:货物入库后,不是“一放了之”。库位要优化、库存要周转、临期品要管理……这就涉及WMS中的“库存移动”操作。移库、补货、冻结分别解决什么问题?什么场景下会用到?本文带你…...

出库篇:仓库里的货往哪去?——WMS出库方式全解析,物流新人必读

仓库里的货往哪去?——WMS出库方式全解析,物流新人必读 摘要:货品有进必有出。上一期我们聊了WMS中货品的四大来源(采购、生产、退货、调拨入库),这一期我们来看看货品是怎么“出”去的——销售出库、采购退…...

入库篇:仓库里的货从哪来?——WMS货品来源全解析,物流新人必读

仓库里的货从哪来?——WMS货品来源全解析,物流新人必读 摘要:每天在WMS系统里看到成百上千的库存记录,但你想过没有——这些货品最初是怎么进入系统的?是采购进来的?生产出来的?客户退回来的&am…...

机器人遥测系统设计:从数据采集到可视化监控的工程实践

1. 项目概述:从开源代码仓库到可观测性实践最近在梳理一些开源机器人项目时,遇到了一个名为jizb880/openclaw_telemetry的仓库。乍一看,这个标题由两部分组成:一个可能是作者的用户名jizb880,以及一个极具指向性的项目…...

开源Claude本地部署指南:从模型选型到性能调优实战

1. 项目概述:当开源精神遇上AI推理最近在折腾本地部署大语言模型的朋友,估计都绕不开一个名字:Claude。作为Anthropic家的明星产品,Claude系列模型以其出色的推理能力、对指令的精准理解和强大的安全性,在开发者圈子里…...

5G NR(新空口)物理层设计解析

5G NR(新空口)物理层设计解析 在无线通信技术的演进过程中,5G NR(新空口)作为第五代移动通信技术的核心组成部分,其物理层设计承载着提升数据传输速率、降低时延、增强连接密度等多重目标。本文将围绕5G NR…...

基于Emissaries框架构建多AI智能体协作系统:从原理到实践

1. 项目概述:一个基于AI的智能体协作框架最近在开源社区里,一个名为muinyc/emissaries的项目引起了我的注意。乍一看这个名字,你可能会联想到“使者”或“特使”,这其实非常贴切地揭示了它的核心定位。简单来说,Emissa…...

车载以太网之要火系列 - 第49篇郭大侠学SOME/IP:人说SOME/IP虽好,对手已在路上跑

写在开篇蓉儿又挖坑上回说到,郭靖学完了SOME/IP的十八般武艺——报文头、Service ID、Instance ID、Method、Event、Field、SD的Offer/Find/Subscribe三驾马车。郭靖合上笔记本,信心满满:“蓉儿,SOME/IP我算是学透了!服…...

机器学习中的视觉与自然语言处理

一两个月前看了李飞飞老师的自传,看第一页就觉得 这是对A国的表白。当然也会遗憾,希望她小时候遇到的老师是更好的老师,她家周围遇到的人是更好的人。这是概率问题,在过去可能不够好今天会更好。 重点是当我看到她在思考智能的起源…...

AMD Ryzen处理器终极调试指南:SMU Debug Tool实战技巧与完整解决方案

AMD Ryzen处理器终极调试指南:SMU Debug Tool实战技巧与完整解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地…...

低空经济崛起,实干企业的“品牌失语”危机比“黑飞”更可怕!

最近,低空经济成为热词。从浙江移动发布的低空智联网“4S”安全服务矩阵,到无人机在医疗、巡检、物流等领域的广泛应用,我们看到了一个万亿级市场的技术底座正在快速搭建。然而,在另一片我们称之为“AI空域”的新战场,…...

低压电工-电子技术常识

一、导体、绝缘体、半导体(按电阻率划分)1. 划分标准单位是 Ω・cm(欧姆・厘米),不是单纯欧姆 (Ω),是电阻率专用单位:欧姆・厘米 Ω⋅cm,也可以用 Ω⋅m(欧姆・米&#…...

ROS新手也能玩转AUBO i5:用MoveIt和Rviz在Ubuntu 20.04上实现机械臂可视化仿真与控制

ROS新手也能玩转AUBO i5:用MoveIt和Rviz在Ubuntu 20.04上实现机械臂可视化仿真与控制 机械臂控制一直是机器人开发中的核心课题,而ROS(Robot Operating System)为这一领域提供了强大的工具链。本文将带你从零开始,在Ub…...

命令行集成AI代码审查:基于Gemini的Git工作流自动化实践

1. 项目概述:当命令行遇上代码审查在开发者的日常工作中,代码审查是保证代码质量、促进知识共享的关键环节。然而,传统的代码审查流程往往伴随着频繁的上下文切换:你需要离开终端,打开浏览器,登录代码托管平…...

百考通AI实践报告:让实习沉淀有迹可循,成长答卷专业呈现

实习实践是连接理论学习与职场实战的桥梁,而一份逻辑清晰、内容详实的实践报告,既是对实习经历的系统复盘,也是个人成长与能力认证的重要载体。然而,许多学生在撰写报告时,常陷入思路混乱、结构松散、重点模糊的困境&a…...

AI智能体长期记忆系统:从RAG到Memory-Skill的工程实践

1. 项目概述:一个关于“记忆”的AI技能最近在折腾AI智能体(Agent)和RAG(检索增强生成)相关的东西,发现一个挺有意思的GitHub项目,叫memory-skill。光看名字,你可能会觉得这是个简单的…...

基于SpringBoot的广西特色水果电商平台的设计与实现

本课题的选题依据及研究意义 一、选题依据和意义 (一)选题依据 随着互联网经济的深入发展,电子商务在推动全球经济发展中发挥了重要作用。其中生鲜电商已成为农产品销售的重要渠道。广西作为我国热带水果的重要产区,对其传统水果产…...

基于SpringBoot的汽车美容养护管理系统的设计与开发

一、选题依据和意义 (一)选题依据 随着国内汽车保有量持续攀升,汽车后市场规模不断扩大,汽车美容养护行业迎来快速发展期,但行业整体仍存在管理效率低下、服务流程不规范等问题[1]。传统管理模式依赖人工记录客户信息…...

开源硬件性能遥测工具openclaw_telemetry:从数据采集到可视化实战

1. 项目概述:从开源遥测数据中洞察硬件性能在硬件开发和性能调优的领域,数据是驱动决策的基石。我们常常需要实时监控CPU、GPU、内存、温度、功耗等一系列关键指标,以评估系统稳定性、定位性能瓶颈或验证优化效果。然而,构建一套稳…...

基于HPM5E00与LAN9252的EtherCAT从站开发板全流程实战

1. 项目概述:从零到一,打造专属的 EtherCAT 从站开发板 最近在工业自动化圈子里,EtherCAT 的热度一直居高不下。它那近乎实时的通讯性能、灵活的拓扑结构,让它在运动控制、机器人、高端数控机床等领域成了“香饽饽”。但很多开发者…...

瑞萨RA4L1 MCU:低功耗与硬件安全设计解析及开发实战

1. 瑞萨RA4L1深度解析:一颗为低功耗与安全而生的MCU最近瑞萨电子更新了他们的RA系列MCU产品线,推出了RA4L1。作为一线嵌入式开发者,每当有新的MCU发布,我总会习惯性地去扒一扒它的数据手册和应用笔记,看看这颗芯片到底…...

转子永磁式无刷混合励磁电机关键技术【附仿真】

✨ 长期致力于次谐波、无刷调磁、有限元建模与分析、多目标鲁棒优化、弱磁运行研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于次谐波调制与变电流…...