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

Sirius内存管理技术:cuCascade分层内存与磁盘溢出机制

Sirius内存管理技术:cuCascade分层内存与磁盘溢出机制

【免费下载链接】sirius项目地址: https://gitcode.com/gh_mirrors/sirius28/sirius

Sirius作为GPU原生SQL引擎,其高效的内存管理技术是实现高性能数据处理的核心。本文将深入解析Sirius采用的cuCascade分层内存管理系统,以及如何通过磁盘溢出机制应对极端内存压力,为您揭示这一终极内存解决方案的工作原理。

内存分层架构:三级存储体系

Sirius通过cuCascade实现了跨越GPU、主机和磁盘的三级内存管理架构,每一层都有其特定的用途和性能特点:

图:Sirius内存分层架构展示了数据在GPU、主机和磁盘之间的流动

GPU内存(Tier 0)

  • 特点:速度最快但容量有限(典型配置约24GB)
  • 用途:主要计算区域,用于管道任务执行
  • 关键参数
    • reservation_limit_fraction = 0.9:可保留的最大比例
    • downgrade_trigger_fraction = 1.0:开始降级的触发阈值
    • downgrade_stop_fraction = 0.7:停止降级的阈值

主机固定内存(Tier 1)

  • 特点:中等速度,容量更大(超过100GB)
  • 用途:缓存区域,GPU与CPU之间的数据传输
  • 关键参数
    • block_size = 64MB:cuCascade块大小
    • pool_size = 1024:每个池的块数量

磁盘(Tier 2)

  • 特点:速度最慢,但容量几乎无限(默认配置约1TB)
  • 用途:极端内存压力下的最后手段
  • 关键参数
    • mount_paths:溢出文件的存储目录
    • memory_capacity = 1TB:总溢出容量

cuCascade集成:核心组件与工作原理

cuCascade作为Sirius的内存管理核心,通过多个关键组件实现高效的内存分层管理:

图:展示了cuCascade在Sirius整体架构中的位置,作为NVIDIA库的重要组成部分

Sirius内存预留管理器

文件src/include/memory/sirius_memory_reservation_manager.hpp

这个组件继承自cucascade::memory::memory_reservation_manager,主要功能包括:

  • 初始化所有GPU内存空间并设置cuDF设备资源
  • 包装cuDF设备资源,保存和恢复以防止悬空引用
  • 将Sirius的任务执行与cuCascade的分层内存管理桥接
  • 销毁时恢复先前的cuDF资源,避免清理期间崩溃

内存空间配置

sirius_config中可以配置不同内存空间的参数:

GPU内存空间配置

device_id; // GPU设备编号 reservation_limit_fraction = 0.9; downgrade_trigger_fraction = 1.0; downgrade_stop_fraction = 0.7;

主机内存空间配置

numa_id; // NUMA节点亲和性 reservation_limit_fraction = 0.9; downgrade_trigger_fraction = 0.8; downgrade_stop_fraction = 0.7; block_size = 64MB; // cuCascade块大小 pool_size = 1024; // 每个池的块数

内存预留机制:预防GPU内存溢出

为了防止GPU内存溢出(OOM),Sirius采用了内存预留机制:

  1. GPU执行器的manager_loop()调用memory_space.make_reservation(estimated_size)
  2. 预留被通过set_reservation()附加到任务的本地状态
  3. 执行期间,操作符在预留范围内分配内存
  4. 任务完成后释放预留

预留感知资源适配器

reservation_aware_resource_adaptor包装了RMM设备内存资源,在每次分配时:

  • 检查预留是否有足够容量
  • 如果耗尽→优雅失败,触发oom_reschedule_exception
  • 实现每个任务可预测的内存使用

降级执行器:智能数据迁移

文件src/include/downgrade/downgrade_executor.hppsrc/downgrade/downgrade_executor.cpp

每个内存空间都有一个downgrade_executor,用于监控内存压力并将数据移动到较低层级。

线程模型

  • 处理线程:从interruptible_mpmc队列顺序出队downgrade_request对象
  • 监控线程(如果monitor_period_ms > 0):轮询内存空间压力,并通过即发即弃方式将监控请求发送到同一队列
  • 工作线程池exec::bounded_thread_pool):并发执行实际的数据移动

降级请求模式

降级执行器使用基于请求的模型,具有分层候选获取:

  1. 调用者调用request_downgrade(predicate),构造downgrade_request并推送到MPMC队列,返回std::future<size_t>
  2. 处理线程顺序出队请求(避免竞争)
  3. 对于每个请求,处理循环按层级顺序惰性获取候选:
    • 第一层(数据仓库):为每个仓库创建convertible_data_batch_provider,一次获取一个空闲GPU驻留批处理
    • 第二层(任务调度队列):创建convertible_gpu_pipeline_task_provider,从管道级任务队列提取具有可转换数据批的任务
  4. 每个候选被调度到bounded_thread_pool,并通过convertible_data::convert()转换

内存消耗历史:智能预测与优化

文件src/include/pipeline/pipeline_memory_history.hpp

每个GPU管道维护一个pipeline_memory_history——最多64个task_memory_record条目的线程安全环形缓冲区,每条记录包括:

  • estimated_bytes— 执行前的估计基础(输入数据大小)
  • peak_memory_bytes— 执行期间观察到的实际峰值分配
  • output_bytes— 输出大小,OOM时为nullopt

记录与估算

  • record(rec)— 任务成功完成时记录
  • record_on_failure(estimated_bytes, peak)— OOM时记录,保留相同输入大小重复失败的较高峰值
  • estimate_peak_memory(estimated_bytes)— 计算历史peak/estimated比率的加权平均值

内存池碎片整理:提高内存利用率

文件src/include/memory/defragmenter_oom_policy.hppsrc/memory/defragmenter_oom_policy.cpp

defragmenter_oom_policy实现了cucascade::memory::oom_handling_policy,在分配失败时:

  1. 通过cudaMemPoolGetAttribute()检查CUDA池碎片(已保留vs.已使用)
  2. 如果reserved > used + (10× requested bytes):池已碎片化
  3. 使用cudaMemPoolTrimTo()修剪池,将空闲块释放给驱动程序
  4. 重试分配
  5. 如果仍然失败:重新抛出原始异常

固定主机内存:加速数据传输

文件:在src/include/sirius_context.hpp中引用

small_pinned_host_memory_resource提供快速主机内存分配:

  • 固定大小的块池:64MB块,每个池1024个块
  • 自动NUMA节点亲和性
  • 用于GPU↔CPU传输和扫描缓存
  • 通过sirius.yaml配置(参见配置文档)

关键文件与参考

文件路径用途
src/include/memory/sirius_memory_reservation_manager.hpp内存管理器,层级配置
src/include/downgrade/downgrade_executor.hpp降级执行器接口
src/downgrade/downgrade_executor.cpp处理循环,分层候选获取
src/include/memory/defragmenter_oom_policy.hpp池碎片整理策略
src/memory/defragmenter_oom_policy.cpp碎片检测和修剪
src/include/pipeline/pipeline_memory_history.hpp每个管道的内存消耗历史

通过cuCascade分层内存管理和智能磁盘溢出机制,Sirius能够高效利用系统资源,在保持高性能的同时处理大规模数据集,为GPU原生SQL引擎树立了新的内存管理标准。无论您是数据工程师、系统管理员还是研究人员,理解这些机制都将帮助您更好地配置和优化Sirius系统。

要开始使用Sirius,请克隆仓库:https://gitcode.com/gh_mirrors/sirius28/sirius,并参考内存管理官方文档进行配置。

【免费下载链接】sirius项目地址: https://gitcode.com/gh_mirrors/sirius28/sirius

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1037122/

相关文章:

  • 2026青岛连锁收金门店对比攻略,直营门店价格统一无差价 - 奢侈品回收测评
  • Convoviz可视化功能详解:创建词云和使用图表分析对话模式
  • 东莞新手出售翡翠攻略,2026连锁回收实体店资质齐全交易隐私安全 - 名奢变现站
  • 屋面防水施工对比,优质杭州屋顶防水公司推荐 - 936品牌测评网
  • 2026工业塑料型材供货指南:如何选择优质厂家? - 品牌2026
  • 2026年上海防水补漏服务完全指南:从老洋房到现代公寓的漏水根治方案 - 精选优质企业推荐官
  • 2026年6月行业内头部硅芯管源头厂家推荐,PVC塑料管/60/50硅芯管/河北格栅管,硅芯管源头厂家口碑推荐 - 品牌推荐师
  • 用豆包几小时摸透AI新概念:概念切片学习法
  • 创意导演技能:科幻风格视频
  • Rails-Perftest进阶指南:深度理解并优化GC运行对Rails应用性能的影响 [特殊字符]
  • Edge-Monitor部署与维护:如何在Windows系统中稳定运行和故障排除
  • 第四代USB闪存控制器:集成电源FET的多卡方案设计与实战
  • 2026 年 6 月上海名表回收靠谱机构推荐|5 家正规回收平台公示 - 开心测评
  • 2026 对标 Altium Designer 的国产高端 PCB 软件推荐 国产 EDA 工具选型参考 - 品牌2026
  • 专网对讲机基础工作原理解析 东北工矿林区通用通信技术科普
  • M68HC08电机控制SDK深度解析:从硬件抽象到实战避坑
  • Ling-2.6-flash-base推理优化:利用KV LoRA实现高效内存管理终极指南 [特殊字符]
  • 2026年6月最新|电动葫芦厂家实测排行榜单推荐:工厂采购高性价比品牌盘点 - 商业新知
  • 2026上海黄金回收综合排名榜首,三十年老店大盘价回收全程透明无套路 - 奢品小当家
  • 深入解析MC68336/376微控制器:CPU32核心与集成外设实战指南
  • Res-Downloader终极指南:如何一键嗅探下载全网视频音频资源
  • 2026莆田全屋定制公司推荐榜单:这10家实力登顶,避坑指南收好 - 资讯速览
  • GEO优化哪家好?KCRE四步法破解企业AI获客难题 - 热点速览
  • 2026 河源电线电缆回收 厂房拆迁旧电缆上门清运估价 - 广东再生资源回收
  • M68HC16 CTM定时器模块:SASM、DASM、PWMSM原理与应用详解
  • 杭州全城黄金回收服务范围 上门回收区域及交易方式整理 - 奢侈品回收评测
  • 揭秘Marketch:3分钟掌握Sketch设计稿转代码的神奇插件
  • 收藏!小白程序员必看:AI大模型企业落地,身份权限管理是关键!
  • py web学习
  • 2026 惠州电缆回收价格 工地剩余废铜电缆今日行情参考 - 广东再生资源回收