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

RHCA10NUMA

内存管理、NUMA架构与CPU磁盘调优笔记

一、NUMA架构详解

(一)NUMA架构基础

  1. 核心定义与硬件特性
    • 定义:NUMA(Non-Uniform Memory Access,非一致性内存访问)架构,与UMA(一致性内存访问)相对,核心特点是CPU访问不同节点内存速度存在差异。
    • 硬件依赖性:由服务器主板设计决定,与操作系统无关,不同节点间通过全互联方式通信(如node0直接连接node1/node2/node3)。
    • 访问性能差异:本地节点(node)内CPU访问内存速度更快,跨节点访问延迟更高(示例:node0到自身距离为10,到node1距离为21)。
  2. 主机NUMA信息查看
    • 关键命令
      • lscpu:快速查看CPU核心分布与NUMA节点基本关联信息。
      • numactl --hardware:专用工具,可显示节点数量、每个节点CPU核心(如node0包含CPU 0,10,14)、内存容量及剩余情况。
    • 示例系统信息:8个NUMA节点,各节点内存与CPU资源独立分配。
  3. 典型应用场景
    • 主要适用领域:云计算虚拟化(如华为Fusion Compute)、高性能计算场景。
    • 核心配置选项:虚拟机NUMA结构自动调整、计算资源调度优化,确保CPU与内存尽量在同一节点,减少跨节点延迟。

(二)NUMA亲和性配置

  1. CPU亲和性配置(taskset工具)
    • 进程绑定:将进程固定在指定CPU核心运行,避免进程在多核心间频繁切换,命令格式:taskset -c <cpu_core> <process>
    • 中断绑定:修改/proc/irq/<irq_number>/smp_affinity文件,将硬件中断绑定到特定CPU,减少中断跨核心开销。
  2. NUMA亲和性配置(numactl工具)
    • 内存绑定策略
      • --membind:强制进程使用指定节点内存(如numactl --membind 1 bigmem 600M,仅用node1内存)。
      • --interleave:跨节点交替分配内存(如numactl --interleave all bigmem 600M,内存均匀分布在所有节点)。
    • 距离查询:通过numactl --hardware查看节点间访问距离,为亲和性配置提供依据。

(三)NUMA实验与验证

  1. 实验准备
    • 模拟NUMA节点:修改/etc/default/grub,添加numa=fake=4参数,执行grub2-mkconfig更新配置,模拟4个NUMA节点。
    • 工具安装yum install numactl安装NUMA管理工具。
  2. 关键实验操作
    • 内存绑定测试numactl -membind 1 -- bigmem 600M,验证node1内存占用变化。
    • 交叉分配测试numactl --interleave all -- bigmem 600M,观察内存是否在所有节点均匀分配。
  3. 结果验证
    • numactl --hardware查看模拟节点状态(如node0分配503MB,剩余311MB)。
    • 对比实验前后各节点内存空闲量,确认亲和性配置生效。

(四)numactl命令深度应用

  1. 基础命令语法与错误示例
    • 错误示范numactl -c bigmem 128M,报错“unparseable node description”,因参数顺序错误。
    • 正确语法:参数需指定节点或策略,如numactl --membind 0 bigmem 128M(绑定node0内存)、numactl --cpunodebind 0 process(绑定node0 CPU)。
  2. 核心参数详解
    参数功能描述示例
    --membind/-m强制使用指定节点内存,不足则进程终止numactl -m 0,1 bigmem 512M
    --cpunodebind/-N绑定进程到指定节点的CPUnumactl -N 0 process
    --interleave/-i跨节点交错分配内存numactl -i all bigdatabase
    --preferred优先使用指定节点内存,不足时自动跨节点numactl --preferred 1 bigmem 768M
    --localalloc/-l恢复默认本地节点分配策略numactl -l /dev/shm/file
  3. 调优案例实践
    • 数据库优化numactl --interleave=all bigdatabase,避免单节点内存瓶颈,提升数据库吞吐量。
    • 网络服务优化numactl --cpunodebind=netdev:eth0 --membind=netdev:eth0 network-server,将服务与网卡中断绑定到同一节点,降低延迟。
    • 内存分配验证:分配256MB内存后,node1剩余从343MB降至18MB,证明默认策略优先使用本地节点内存。

(五)NUMA节点资源监控与模拟

  1. 节点资源查看
    • 内存分布示例:node0(总503MB/空闲311MB)、node1(总343MB/空闲87MB)、node2(总479MB/空闲475MB)、node3(总502MB/空闲497MB)。
    • 系统资源辅助监控df -h查看文件系统(/dev/vda1使用20%)、free -m查看总内存(1828MB,可用1365MB)。
  2. 模拟环境配置
    • 节点距离设置:默认所有节点距离为10(实验环境),实际场景需按硬件拓扑设置差异化距离(如node0-node0=10,node0-node1=21)。
    • 资源使用验证:通过numastat -c bigmem查看进程在各节点内存分布(如512MB分配时,node1用70MB、node2用439MB)。

二、内存管理及优化

(一)课前核心知识回顾

  1. 内存调优核心概念:内存回收、缓存机制、内存过量分配、OOM(内存溢出)、内存泄露、共享内存、NUMA架构。
  2. NUMA关键技术:节点亲和性(CPU/内存绑定)、中断亲和性、进程绑定,核心目标是减少跨节点访问延迟。

(二)大页与透明大页

  1. 大页(Huge Page)
    • 基本概念:特殊内存区域,为页表提供缓存,尺寸远大于标准页(4KB),需占用连续内存且不可回收。
    • 核心作用:减少TLB(转换检测缓冲区)miss,提升内存访问效率(TLB可缓存更多内存地址映射)。
    • 系统配置难点:默认不分配,分配后永久占用内存,需精准预估业务需求(设置过多浪费、过少不足)。
  2. 透明大页(THP)
    • 设计原理:红帽6.2起默认启用,系统动态分配大页,无需手动配置,降低管理复杂度。
    • 配置模式
      • always:强制启用,所有进程默认使用THP。
      • madvise:仅对标记过的虚拟内存区域(VMA)启用。
      • never:完全禁用,适用于高内存消耗服务。
    • 应用建议:常规场景优先使用THP;Oracle、MongoDB、Redis等服务建议禁用(避免延迟与内存碎片问题),禁用命令:echo never > /sys/kernel/mm/transparent_hugepage/enabled(需重启服务生效)。

(三)共享内存与Swap

  1. 共享内存
    • 实现方式:将/dev/shm挂载为tmpfs文件系统,通过dd if=/dev/zero of=/dev/shm/test bs=1M count=50创建50MB内存磁盘。
    • 性能优势:I/O速度远快于物理磁盘,适合临时数据存储(如缓存、进程间通信数据)。
  2. Swap(交换空间)
    • 核心作用
      • 内存扩展:物理内存耗尽时,临时存储不常用数据,防止OOM。
      • 系统保护:无Swap时,系统强制终止高oom_score进程,可能导致关键服务中断。
    • 配置管理
      • 设备限制:单个系统最多支持32个Swap设备。
      • 创建与激活mkswap /dev/vdb1(创建)、swapon /dev/vdb1(激活单个)、swapon -a(激活所有)。
      • 关闭方式swapoff /dev/vdc1(关闭单个)、swapoff -a(关闭所有)。
    • 优先级与性能优化
      • 优先级规则:数值越大优先级越高(-2 > 0),高优先级Swap优先使用,同优先级均衡分配。
      • 性能建议:优先使用独立分区(优于文件形式),大容量Swap分散在多个物理硬盘(如4G拆分为2个2G)。
    • 容量规划与数据特性
      • 容量建议:内存≤16G时设为2倍;大内存(256G)无需按比例,内存密集型应用需适当增大。
      • 数据安全:正常关机数据回写内存,异常关机丢失,无法恢复。

(四)内存管理核心组件与问题诊断

  1. 核心组件:虚拟内存映射、页表(Page Table)、TLB、大页内存。
  2. 关键机制:页面回收、内存交换(Swap)、过量分配(OOM)、共享内存。
  3. 问题诊断方向:内存泄漏检测(valgrind工具)、透明大页配置检查、Swap性能调优(优先级与设备分布)。

三、CPU缓存和磁盘调度算法

(一)CPU缓存原理与优化

  1. 缓存命中与丢失
    • 缓存命中:CPU所需数据在缓存中,命中率越高执行效率越好,适合重复数据处理(如循环运算)。
    • 缓存丢失:数据不在缓存,需从内存读取填充,不适合大数据量非重复操作(如数据压缩、批量图片处理)。
  2. 缓存写入策略
    • 透写(Write-through):修改后立即写回内存,数据一致性高但性能开销大。
    • 回写(Write-back):仅当缓存块被替换时写回内存,性能好但异常断电有数据丢失风险。
  3. 异构计算平台对比
    计算单元核心特点适用场景
    CPU70%控制/30%运算,串行处理,逻辑精确复杂逻辑运算、业务流程控制
    GPU95%运算,并行能力强,精度要求低图像识别、大数据量并行计算(AI训练)
    FPGA可编程定制灵活适配特定场景(如通信协议处理)
    ASIC专用不可编程,效率高、能耗低固定场景(如加密解密、AI推理)
  4. 三级缓存结构
    • 层级特性:L1(最快、容量最小,私有)→ L2(中速、中容量,部分共享)→ L3(最慢、容量最大,全共享)。
    • 性能对比:L1需3个CPU周期,L2需15周期,内存需160周期(L1比内存快50倍以上)。
    • 填充机制:缓存丢失时,按L3→L2→L1顺序填充。
  5. 主存与缓存映射方式
    • 直接映射:缓存块与主存固定对应,实现简单但易冲突,现代系统少用。
    • 全映射:缓存块可对应任意主存区域,无冲突但实现复杂、硬件开销大。
    • 组互联:折中方案,缓存与主存分组,组内全映射、组间直接映射,采用LRU替换策略,为当前主流方式。
  6. 缓存性能测试工具
    • valgrind(cachegrind)valgrind --tool=cachegrind <程序名>,输出丢失率(如0.9%对应99%命中率,优秀;14.3%较差)。
    • time工具:测量用户时间、系统时间、总时间,验证性能差异(如cache1运行1.43秒,cache2运行7秒)。
  7. 程序优化原则:循环语句需保证数据访问局部性(顺序访问),测试阶段用valgrind选择丢失率<1%的实现方案。

(二)磁盘调度算法与预取策略

  1. 磁盘读预取功能
    • 智能预取:内核动态检测IO模式,顺序IO自动启动、随机IO自动停止,自适应业务场景。
    • 固定预取:每次预取固定大小(如32KB、128KB),通过系统参数设置(如4096KB=4M),适用于已知IO大小的场景。
    • 倍数预取:按当前IO大小倍数预取(如64KB→256KB,4倍),平衡预取效果与内存占用。
    • 不预取:关闭预取,适用于完全随机IO业务,避免资源浪费。
  2. 应用案例:Nginx优化
    • 调优要点:设置最大打开文件数(/etc/security/limits.conf)、网卡中断与CPU绑定、工作进程与CPU绑定(taskset)、选择合适IO调度算法、关闭Swap。
    • 性能影响:顺序IO启用预取,随机IO关闭预取,需根据实际负载测试调整预取值。

四、课程进度与重点预告

(一)剩余内容与时间规划

  1. 剩余知识点:磁盘调度算法及优化、FIO工具使用、网络调优技术、综合实训(含考试要点)。
  2. 时间安排:预计2-3个教学日(周三至周五),最快周四结课,最迟周五晚间。
  3. 课程总量:已完成8-10次课,总课时约10余次。

(二)重点知识模块预告

  1. 磁盘调度算法:学习常见算法原理、性能优化方法、场景对比,FIO工具为核心实践工具。
  2. 网络调优专题:协议栈参数优化、吞吐量提升、延迟敏感型应用优化。
  3. 综合实训:串联全知识模块,强化重点记忆,突破考试要点,通过完整案例复现所有功能。

(三)预习建议

提前预习磁盘I/O原理、网络基础协议(TCP/IP、UDP),为后续课程打下基础。

五、知识小结

知识点核心内容考试重点/易混淆点难度系数
NUMA架构非一致性内存访问,CPU与内存分组,节点间距离差异node间距离 vs UMA统一总线;numactl命令参数★★★★
内存管理过量分配/OOM/泄露/共享内存;大页与透明大页;Swap配置共享内存文件系统挂载;透明大页动态vs静态配置★★★☆
大页机制标准页(4KB)vs大页(2MB),TLB缓存页表项透明大页禁用场景(Oracle/Redis)★★★★
Swap配置优先级(-2最高)、多设备均衡分布swapon -a(所有)vs指定设备激活★★★☆
CPU缓存三级缓存结构(L1/L2私有,L3共享);命中率测试valgrind工具检测缓存丢失率;循环优化原则★★★★
异构计算CPU逻辑运算 vs GPU并行计算AI训练场景GPU应用;FPGA/ASIC差异★★★★
磁盘预取智能/固定/倍数/关闭四种策略顺序IO启用vs随机IO关闭;预取值配置★★★☆
性能调优Nginx:文件数/CPU绑定/中断均衡多参数联动配置;实际业务负载测试★★★★★
http://www.xdnf.cn/news/18509.html

相关文章:

  • Pytorch框架学习
  • Git 新手完全指南(一):从零开始掌握版本控制
  • 59. 螺旋矩阵 II|从“左闭右开”的圈层模拟入手(附图解与 C++ 实现)
  • 在 Linux 和 Docker 中部署 MinIO 对象存储
  • 使用Spring Retry组件优雅地实现重试
  • 【Python】利用heapq 模块实现一个按优先级排序的队列
  • 数字化图书管理系统设计实践(java)
  • CorrectNav——基于VLM构建带“自我纠正飞轮”的VLN:通过「视觉输入和语言指令」预测导航动作,且从动作和感知层面生成自我修正数据
  • 学习嵌入式的第二十二天——数据结构——双向链表
  • 永磁同步电机谐波抑制算法(13)——传统预测控制与传统谐波抑制的碰撞
  • week2-[二维数组]排队
  • MySQL 50 道经典练习题及答案
  • Java毕业设计选题推荐 |基于SpringBoot+Vue的知识产权管理系统设计与实现
  • Effective C++ 条款52:写了placement new也要写placement delete
  • ES常用查询命令
  • SQL详细语法教程(七)核心优化
  • ubuntu系统上的conda虚拟环境导出方便下次安装
  • PiscCode使用MediaPipe Face Landmarker实现实时人脸特征点检测
  • YOLO11 到 C++ 落地全流程:ONNX 导出、NMS 判别与推理实战
  • Java 通过 m3u8 链接下载所有 ts 视频切片并合并转换为 mp4 格式
  • 《GPT-OSS 模型全解析:OpenAI 回归开源的 Mixture-of-Experts 之路》
  • 深入理解MySQL Ⅳ -- SQL性能分析工具
  • 文件操作NIO Files的简单使用
  • InfluxDB 查询性能优化实战(一)
  • SCAU学习笔记 - 自科三面前端方向实战演示
  • Disruptor核心接口EventHandler解析
  • 【Techlog】01入门-井筒数据整合软件的基本认识
  • C5.6:双电源发射极偏置、特殊类偏置、PNP型偏置电路
  • ODPS 十五周年实录 | 为 AI 而生的数据平台
  • 机器学习(Machine Learning, ML)