HPC集群SLURM作业中cp/rsync如何关闭RAM缓存避免OOM
解决方案
以下方案均不需要提升作业声明的RAM配额,不会在模拟运行周期内额外锁定内存资源,可直接替换原有复制命令:
- 采用直连IO模式复制,完全绕过系统页缓存
默认cp命令没有提供绕过页缓存的参数,可替换为dd命令搭配direct IO标志实现,全程不会将文件数据缓存到内存,单进程内存占用稳定在5MB以内。单文件复制示例:
目录复制场景可配合dd if=源文件路径 of=目标路径 bs=1M conv=fdatasync iflag=direct oflag=directfind命令遍历执行,逻辑简单,适配所有Linux环境。 - 使用rsync内置的丢缓存参数
若计算节点rsync版本≥3.2.0,可直接使用--drop-cache参数,该参数会在读取每个文件块后主动通知系统释放对应页缓存,不会产生累积内存占用,且和原cp -Hpv的行为完全对齐(保留硬链接、保留文件权限属性、显示复制进度),替换成本最低:rsync -aHvP --drop-cache ${CONTENTS} ${TMPDIR} - 低版本环境兼容方案(无需root权限)
若集群工具版本受限,可在复制时启动后台进程定期清理当前作业cgroup下的页缓存,SLURM集群默认会给作业所属用户开放对应cgroup路径的写权限,不需要管理员配合:
该方案下复制过程的内存占用不会超过30MB,完全不会触发cgroup OOM杀死进程,适配数千并发作业的批量运行场景。# 启动后台清缓存进程,每2秒清理一次当前作业的页缓存 ( CGROUP_DROP_CACHE=$(find /sys/fs/cgroup -name "drop_caches" | grep "job_${SLURM_JOB_ID}" | head -n1) while true; do echo 1 > $CGROUP_DROP_CACHE sleep 2 done ) & CACHE_CLEAN_PID=$! # 执行原有复制命令 cp -Hpv ${CONTENTS} ${TMPDIR} # 复制完成后清理后台进程 kill $CACHE_CLEAN_PID
注意:不建议采用管理员提出的超额预留RAM方案,该方案会在长达数天的模拟周期内锁定大量闲置内存,大幅降低集群资源利用率,也会限制单批次可提交的作业总数。
内容的提问来源于stack exchange,提问作者user18298
相关产品推荐
相关产品推荐

