尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Sirius内存管理技术:cuCascade分层内存与磁盘溢出机制
📅 发布时间:2026/6/18 17:24:47

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.hpp、src/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.hpp、src/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),仅供参考

相关新闻

  • jQuery Anystretch核心功能解析:10个实用技巧提升网站视觉体验
  • 2026年上海防水补漏服务完全指南:从老洋房到现代公寓的漏水根治方案 - 精选优质企业推荐官
  • 2026年6月行业内头部硅芯管源头厂家推荐,PVC塑料管/60/50硅芯管/河北格栅管,硅芯管源头厂家口碑推荐 - 品牌推荐师

最新新闻

  • 163MusicLyrics:网易云QQ音乐歌词快速获取完整解决方案
  • GitHub Desktop中文汉化终极指南:5分钟快速上手,告别英文界面困扰
  • 寄快递怎么最省钱?2026各快递品牌低价寄件方法全汇总 - 快递物流资讯
  • 2026安徽酒店全套设备回收专业技术测评报告 - 安徽工业
  • 等离子表面处理机厂家技术实力对比与选型参考 - 起跑123
  • 豆包提示工程实战指南:从失效诊断到工作流嵌入

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号