【问题标题】:Remove zombie processes using parallel package使用并行包删除僵尸进程
【发布时间】:2012-03-18 05:17:43
【问题描述】:

在我基于 Debian 的机器上使用 R 的并行包玩了一段时间后,我仍然找不到在计算后删除所有僵尸子进程的方法。

我正在寻找通用且独立于操作系统的解决方案。

下面是一个说明 2 核问题的简单脚本:

library(parallel)
testfun <- function(){TRUE}

cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK")
cl <- makeCluster(2, type = cltype)
p <- clusterCall(cl, testfun)
stopCluster(cl)

不幸的是,这个脚本在进程表中留下了两个僵尸进程,只有在 R 关闭时才会被杀死。

【问题讨论】:

  • 他们不是僵尸,他们只是失业的孩子

标签: r parallel-processing zombie-process


【解决方案1】:

这似乎只是“FORK”集群的问题。如果您改为创建“PSOCK”集群,则当您调用 stopCluster(cl) 时,进程将终止。

是否有什么阻止您在基于 Debian 的机器上使用“PSOCK”集群?

【讨论】:

  • 嗨 Josh,很抱歉我的回复晚了 - 你是对的,这似乎只是 Fork Clusters 的问题。 PSOCK 集群也可以在我的 Debian 机器上运行——只是认为 Forking 会更快。非常感谢!
  • 这似乎是对 FORK 集群的愚蠢疏忽。我在bugs.r-project.org/bugzilla3/show_bug.cgi?id=15471 发布了一个错误报告。僵尸进程大多是无害的,因为它们不消耗资源。它们只是坐在进程表中,以便父进程可以检查它们的退出状态。使用library(fork) wait() 检查它们的退出状态将一次清理一个僵尸(并打印每个僵尸的退出状态)。
  • fork 包不再可用。
【解决方案2】:

您的问题的答案可能在makeCluster() 命令的帮助文件中。

在文件的底部,写着:最好通过调用 stopCluster 来关闭 worker:但是一旦它们正在侦听命令的套接字变得不可用,worker 将自行终止,这如果主 R 会话完成(或其进程终止),则应该这样做。

解决方案是(它对我有用)在创建集群时为集群定义一个端口。

cl <- makeCluster(2, type = cltype,port=yourPortNumber)

另一个(可能没有用)解决方案是为您的套接字设置超时。超时变量以秒为单位。

cl <- makeCluster(2, type = cltype,port=yourPortNumber,timeout=50)

无论如何,目标应该是使套接字连接不可用。关闭端口或关闭主 R 进程都会这样做。

编辑:我的意思是关闭进程正在侦听的端口。它应该独立于操作系统。您可以尝试使用 -> showConnections(all = TRUE); 。这将提供所有连接。那你可以试试closeAllConnections();

对不起,如果这也不起作用。

【讨论】:

  • 在 Ubuntu 上指定端口号对我不起作用。你运行的是什么版本的 Debian?
  • 关于您的编辑:stopCluster(cl) 已经关闭了端口。这就是导致进程成为僵尸进程的原因。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2014-10-12
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多