【问题标题】:Why are different nodes running different compiles of my executable? (MPI)为什么不同的节点运行我的可执行文件的不同编译? (MPI)
【发布时间】:2012-08-23 10:50:45
【问题描述】:

在我重新编译我的 (C) 程序后,一些节点正在运行旧的编译(调试信息仍在其中),而一些节点正在运行新的副本。服务器运行的是 Gentoo Linux,所有节点都从同一个存储中获取文件。我被告知文件系统是 NFS。我使用的 MPI 是 MPICH 版本 1.2.7。 为什么有些节点没有使用新编译的副本?

更多细节(以防您无法入睡):

我正在尝试创建我的第一个 MPI 程序(我也是 C 和 Linux 的新手)。我的代码中有以下内容:

#if DEBUG
  {
    int i=9;
    pid_t PID;
    char hostname[256];
    gethostname(hostname, sizeof(hostname));
    printf("PID %d on %s ready for attach.\n", PID=getpid(), hostname);
    fflush(stdout);
    while (i>0) {
      printf("PID %d on %s will wait  for `gdb` to attach for %d more iterations.\n", PID, hostname, i);
      fflush(stdout);
      sleep(5);
      i--;
    }
  }
#endif

然后我重新编译了(没有-DDEBUG=1选项,所以上面的代码被排除了)

$ mpicc -Wall -I<directories...> -c myprogram.c
$ mpicc -o myprogram myprogram.o -Wall <some other options...> 

程序编译没有问题。然后我像这样执行它:

$ mpirun -np 3 myprogram

有时(而且越来越频繁),可执行文件的不同副本会在集群的不同节点上运行?在某些节点上,调试代码会执行(并打印),而在某些节点上则不会。

请注意,集群当前正在经历一些“时钟偏差”(或类似情况),这可能是原因。这是问题所在吗?

另外请注意,我实际上只是通过注释/取消注释 Makefile 中的行来更改编译选项,因为我还没有时间实现 these suggestions

编辑:当问题出现时,md5sum myprogram 在出现问题的节点上返回不同的值。

【问题讨论】:

  • 问题是由于时钟偏差。您应该运行 NTP 以同步集群上的时钟。基本上,与构建机器(或 NFS 服务器)相比,某些机器上的时钟是未来的,因此他们认为他们的文件副本更新。如果您无法在集群上设置 NTP,您可以在每次构建之前删除可执行文件作为解决方法。
  • 好的。大奶酪现在正试图找出时钟偏差。但请注意,我确实尝试删除可执行文件(使用make clean),然后在构建之前重新编译,但问题还是再次出现。 “他们认为他们的文件副本较新”是什么意思?他们不是都访问同一个副本吗?具体来说,它是磁盘驱动器上的那个。您是指程序的缓存副本,还是类似的东西?
  • 对不起,删除的想法行不通,原因相同:缓存。 NFS 缓存文件属性和正/负查找(找到/未找到文件,这就是删除不起作用的原因)。此缓存与普通缓冲区缓存一起使用 - 缓存的缓冲区仅在属性无效时才会失效。现在我想起来了,我实际上并不确定时钟偏差是否会影响 NFS 缓存。不过,它肯定会与make 混淆。尝试使用 noac 选项挂载您的 NFS 共享以禁用属性缓存。
  • 我们修复了时钟偏差,但问题仍然存在。现在md5sum 永远不会更新,即使新编译的版本是正在执行的版本。我想我会尝试用noac 说服所有者安装。
  • noac 的性能损失会花费我们多少?它会影响什么?谢谢。

标签: c linux mpi gentoo


【解决方案1】:

您的不同节点保留了文件的副本,并且在您运行二进制文件时正在使用该文件而不是最新的。这与 Gentoo 几乎没有关系,因为它是 Linux(内核)缓存和/或 NFS 实现的产物。

换句话说,您的二进制文件已被缓存。阅读这个答案:

NFS cache-cleaning command?

Tweaking some settings 也可能有帮助。


我这里碰巧有一个同步和刷新的命令:

$ cat /home/jaroslav/bin/flush_cache 
sudo sync
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

【讨论】:

猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
相关资源
最近更新 更多