Sirius内存管理技术cuCascade分层内存与磁盘溢出机制【免费下载链接】sirius项目地址: https://gitcode.com/gh_mirrors/sirius28/siriusSirius作为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 64MBcuCascade块大小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内存溢出OOMSirius采用了内存预留机制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::futuresize_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.cppdefragmenter_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),仅供参考