Slurm上RStudio Server运行future并行任务接收结果出错求助
问题排查方向
1. 进程资源过载
- 你设置了120个worker,接近节点122核的上限,系统进程本身会占用少量核心,导致CPU调度竞争剧烈,可能引发进程连接中断。建议先降低worker数量(比如80-100)测试,观察是否还会崩溃。
- 虽然总内存申请了1000GB,但120个进程同时执行
unzip -p+fread,可能出现瞬间内存峰值,触发系统OOM Killer直接杀掉worker进程。可以通过以下方式验证:- 用
seff <你的Slurm任务ID>查看任务的内存使用峰值和是否有OOM记录; - 任务运行时在节点上用
htop实时监控内存和CPU占用情况。
- 用
2. Progressr并行环境兼容性
- 错误日志显示
p(progressor函数)作为全局变量被传递,progressr在远程R Server+多进程的组合环境中,可能存在跨进程通信的潜在问题。可以临时注释掉进度条相关代码,测试任务是否能正常完成:# p <- progressor(along = filepath_list) # ... # p(sprintf("x=%g", x)) - 如果注释后正常,尝试更换progressr的handler,比如改用文本进度条:
handlers("txtprogressbar")
3. 全局变量传递优化
- 虽然全局变量总大小不大,但自动捕获的全局变量可能存在序列化/反序列化的隐性问题。可以在
foreach中明确指定需要传递的变量,避免不必要的全局变量传递:list_df <- foreach(x = seq_along(filepath_list), .export = c("filepath_list", "root_symbol"), .packages = c("data.table", "stringr")) %dopar% { # ... 原有代码 } - 进一步优化:拆分
filepath_list,让每个worker只获取自己需要处理的文件命令,减少单进程的数据传递量,比如用itertools拆分:library(itertools) list_df <- foreach(file_cmd = isplitVector(filepath_list, chunks = 120)) %dopar% { lapply(file_cmd, function(cmd) { DT = fread(cmd = cmd, fill=TRUE) if (!is.null(root_symbol)) DT = DT[root %chin% root_symbol] gc() DT }) } list_df <- unlist(list_df, recursive = FALSE)
4. 包版本与环境变化
- 你提到之前运行正常,近期出错,大概率是依赖包或系统环境更新导致的兼容性问题:
- 检查future、doFuture、data.table的版本变化,尝试回退到之前稳定的版本。比如future 1.26.1如果是新更新的,回退到1.25.x版本;
- 检查系统BLAS/LAPACK库是否有更新,openblas的多线程设置可能影响R进程的资源占用,尝试在Slurm脚本中添加
export OMP_NUM_THREADS=1,或者在R中设置options(datatable.threads=1),避免fread自动启用多线程引发核心竞争。
5. R Server与Slurm的交互问题
- 当前任务是通过SSH隧道连接R Server启动的,R Server的进程管理可能限制了子进程的资源或通信。尝试直接在Slurm脚本中运行R脚本(而非启动R Server),验证是否能复现错误:
修改Slurm脚本:
其中#SBATCH --ntasks=1 #SBATCH --output=rscript.log #SBATCH --nodes=1 #SBATCH --cpus-per-task=122 #SBATCH --mem=1000gb Rscript your_script.Ryour_script.R包含你的并行计算代码,排除R Server的干扰。
内容的提问来源于stack exchange,提问作者Matthew Son
相关产品推荐
相关产品推荐

