我运行一个使用Boost MPI(1.55)在开放MPI(1.6.1)计算群集上项目。开放MPI和Boost MPI使用过多的文件句柄
我们的集群有一个有64个CPU的节点,我们产卵上的每个单一的MPI进程。我们大多数的沟通是在各个进程之间进行的,每个进程都打开一系列irecv()请求(针对不同的标记),并使用send()进行阻塞。
我们得到的问题是,处理(通常在10分钟)的短时间之后,我们得到这个错误,导致该程序结束:
[btl_tcp_component.c:1114:mca_btl_tcp_component_accept_handler] accept() failed: Too many open files in system (23).
仔细调试表明,它是占用这些文件句柄的网络套接字,并且我们正在打开我们的操作系统限制的65536个文件句柄。其中大部分都处于“TIME_WAIT”状态,这显然是TCP在关闭套接字(通常是)后60秒(为了捕获任何延迟数据包)所做的工作。我的印象是Open MPI没有关闭套接字(http://www.open-mpi.org/faq/?category=tcp#tcp-socket-closing),只是保持打开N^2个套接字,以便所有进程都可以相互通信。很明显,65536远远超过64^2(涉及MPI的这个错误的最常见原因就是文件限制小于N^2),其中大多数是处于最近关闭状态的套接字。
我们的C++代码是太大,不适合这里,但我已经写了一些它的简化版本,以至少说明我们的实现,看看是否有与我们的技术的任何问题。我们在使用MPI时是否会导致OpenMPI关闭并重新打开太多套接字?
namespace mpi = boost::mpi;
mpi::communicator world;
bool poll(ourDataType data, mpi::request & dataReq, ourDataType2 work, mpi::request workReq) {
if(dataReq.test()) {
processData(data); // do a bunch of work
dataReq = world.irecv(mpi::any_source, DATATAG, data);
return true;
}
if(workReq.test()) {
int target = assess(work);
world.send(target, DATATAG, dowork);
world.irecv(mpi::any_source, WORKTAG, data);
return true;
}
return false;
}
bool receiveFinish(mpi::request finishReq) {
if (finishReq.test()) {
world.send(0, RESULTS, results);
resetSelf();
finishReq = world.irecv(0, FINISH);
return true;
}
return false;
}
void run() {
ourDataType data;
mpi::request dataReq = world.irecv(mpi::any_source, DATATAG, data);
ourDataType2 work;
mpi::request workReq = world.irecv(mpi::any_source, WORKTAG, work);
mpi::request finishReq = world.irecv(0, FINISH); // the root process can call a halt
while(!receiveFinish(finishReq)) {
bool doWeContinue = poll(data, dataReq);
if(doWeContinue) {
continue;
}
// otherwise we do other work
results = otherwork();
world.send(0, RESULTS, results);
}
}
哦,亲爱的C++,所以请随身携带的巨大需要提醒的是,我不明白的语言下面......无论如何,我看不到任何MPI_WAIT或MPI_TEST - 只要你有一个无阻塞MPI宣传中应该相应的等待。我的怀疑是没有这些套接字没有被关闭,但我必须强调这是一个猜测,因为等待/测试可能在其他地方,或者C++可能比我目前认为的更加怪异。 –
是的@IanBush,C++对我们不太友善。在Boost MPI层的顶部,像dataReq.test()这样的语句类似于特定irecv上的mpi_test。我不确定是否需要等待是否有定期轮询测试? – Marc