指定workers参数运行plan(multisession())报PSOCK节点连接错误
问题产生原因
报错核心原因是你传入的workers = 10参数未被并行后端识别生效,代码实际尝试创建与服务器检测到的总可用核心数(144个)等量的PSOCK并行节点,最终触发R版本自带的socket连接数上限限制。
R的预编译版本默认对PSOCK集群的socket连接数设置了128的硬上限,扣除R进程本身运行预留的4个连接后,剩余可用于并行节点的连接数正好是124个,和报错信息完全匹配。
常见触发场景
- 传参位置错误:
workers是multisession()后端的参数,不是外层plan()函数的参数。如果写成plan(multisession(), workers = 10),参数不会传递给并行后端,后端会自动调用核心数检测逻辑,按检测到的144核申请节点。 - 全局选项被覆写:如果之前运行过设置
options(mc.cores = 144)、options(future.workers = 144)的代码,或是加载了会自动配置并行参数的HPC相关R包,会直接覆盖plan()里传入的worker数设置,强制按总核心数创建节点。 - 旧版本future/furrr包bug:部分1.20版本之前的future包存在参数传递逻辑缺陷,在CPU核心数大于128的服务器上运行时,会忽略用户手动传入的workers参数,直接按检测到的总核心数创建集群。
修复方案
- 修正传参格式,将workers参数传入
multisession()内部,写法如下:
plan(multisession(workers = 10))
- 设置plan前先重置全局并行选项,排除其他配置干扰:
options(mc.cores = NULL, future.workers = NULL) plan(multisession(workers = 10))
- 如果上述方法无效,可以手动创建PSOCK集群后再传给plan,绕开自动检测逻辑:
# 手动创建10个节点的集群 cl <- parallel::makePSOCKcluster(names = 10) # 注册集群给future使用 plan(cluster, workers = cl) # 计算完成后记得关闭集群释放资源 parallel::stopCluster(cl)
提示:不要尝试通过修改R源码重编译的方式调高socket连接数上限,多用户服务器环境下创建过多PSOCK节点会占用大量系统资源,反而会导致计算效率下降、进程异常中断。
内容的提问来源于stack exchange,提问作者ADF
相关产品推荐
相关产品推荐

