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采用了内存预留机制:
- GPU执行器的
manager_loop()调用memory_space.make_reservation(estimated_size) - 预留被通过
set_reservation()附加到任务的本地状态 - 执行期间,操作符在预留范围内分配内存
- 任务完成后释放预留
预留感知资源适配器
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):并发执行实际的数据移动
降级请求模式
降级执行器使用基于请求的模型,具有分层候选获取:
- 调用者调用
request_downgrade(predicate),构造downgrade_request并推送到MPMC队列,返回std::future<size_t> - 处理线程顺序出队请求(避免竞争)
- 对于每个请求,处理循环按层级顺序惰性获取候选:
- 第一层(数据仓库):为每个仓库创建
convertible_data_batch_provider,一次获取一个空闲GPU驻留批处理 - 第二层(任务调度队列):创建
convertible_gpu_pipeline_task_provider,从管道级任务队列提取具有可转换数据批的任务
- 第一层(数据仓库):为每个仓库创建
- 每个候选被调度到
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,在分配失败时:
- 通过
cudaMemPoolGetAttribute()检查CUDA池碎片(已保留vs.已使用) - 如果
reserved > used + (10× requested bytes):池已碎片化 - 使用
cudaMemPoolTrimTo()修剪池,将空闲块释放给驱动程序 - 重试分配
- 如果仍然失败:重新抛出原始异常
固定主机内存:加速数据传输
文件:在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),仅供参考
