【问题背景】

某现场在通过 yasldr 工具将 NewCIS 报表数据(约 300GB)导入 YashanDB 分布式环境时,遇到频繁报错:

failed to allocate 6812396 bytes memory quota for init bulkload quota

导入任务中断,影响测试与业务数据入库。

【环境信息】

YashanDB 版本:23.2.4.100 Enterprise Edition

部署拓扑:1mm + 1cn + 3dn

硬件配置:125GB 内存 / 32 核 CPU / 2TB HDD

导入方式:yasldr,单进程、32线程、bulkload 模式

【问题分析】

bulkload 模式下的内存分配逻辑

每个导入线程能使用的内存大小受以下公式控制:


可用总内存 = COLUMNAR_MATERIAL_PERCENT × COLUMNAR_VM_BUFFER_SIZE × BULKLOAD_MAX_MEM_PERCENT

COLUMNAR_VM_BUFFER_SIZE = 19375MB(配置)

COLUMNAR_MATERIAL_PERCENT = 80%(默认)

BULKLOAD_MAX_MEM_PERCENT = 80%(默认)

即:

总可用内存 = 80% × 19375M × 80% ≈ 12400MB
在设置 8 个 yasldr 实例、每实例 32 个线程时,总线程数达:

8 × 32 = 256
平均每个线程的内存仅为:

12400MB / 256 ≈ 48.4MB
这远远无法满足高数据密度(如每行 20KB)的批量写入。

【规避建议】

方法一:降低线程数量

减小 yasldr 启动时的线程数,如控制在 8~16 以内,可显著提升单线程可分配内存。

方法二:调大内存参数(推荐)

可在导入前调整以下参数:

image.png

根据资源情况灵活设置,建议每线程内存不得低于 300MB,否则容易因数据行较大而失败。

【实时监控建议】

YashanDB 提供视图 dV$bulkloadStat 可用于观察当前导入线程状态、资源占用、异常计数等,便于动态排查。

SELECT * FROM dV$bulkloadStat;
【总结】
图片


数据库砖家
1 声望0 粉丝